Skip to content

Commit 9544a47

Browse files
filter
1 parent 9d8bdd7 commit 9544a47

File tree

2 files changed

+24
-13
lines changed

2 files changed

+24
-13
lines changed

vm/src/obj/objfilter.rs

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,24 @@
1-
use super::objbool;
2-
use super::objiter;
31
use crate::pyobject::{
4-
IdProtocol, PyContext, PyFuncArgs, PyObject, PyObjectPayload, PyResult, TypeProtocol,
2+
IdProtocol, PyContext, PyFuncArgs, PyObject, PyObjectPayload, PyObjectPayload2, PyObjectRef,
3+
PyResult, TypeProtocol,
54
};
65
use crate::vm::VirtualMachine; // Required for arg_check! to use isinstance
76

7+
use super::objbool;
8+
use super::objiter;
9+
10+
#[derive(Debug)]
11+
pub struct PyFilter {
12+
predicate: PyObjectRef,
13+
iterator: PyObjectRef,
14+
}
15+
16+
impl PyObjectPayload2 for PyFilter {
17+
fn required_type(ctx: &PyContext) -> PyObjectRef {
18+
ctx.filter_type()
19+
}
20+
}
21+
822
fn filter_new(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
923
arg_check!(
1024
vm,
@@ -13,9 +27,11 @@ fn filter_new(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
1327
);
1428
let iterator = objiter::get_iter(vm, iterable)?;
1529
Ok(PyObject::new(
16-
PyObjectPayload::FilterIterator {
17-
predicate: function.clone(),
18-
iterator,
30+
PyObjectPayload::AnyRustValue {
31+
value: Box::new(PyFilter {
32+
predicate: function.clone(),
33+
iterator,
34+
}),
1935
},
2036
cls.clone(),
2137
))
@@ -24,10 +40,10 @@ fn filter_new(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
2440
fn filter_next(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
2541
arg_check!(vm, args, required = [(filter, Some(vm.ctx.filter_type()))]);
2642

27-
if let PyObjectPayload::FilterIterator {
43+
if let Some(PyFilter {
2844
ref predicate,
2945
ref iterator,
30-
} = filter.payload
46+
}) = filter.payload()
3147
{
3248
loop {
3349
let next_obj = objiter::call_next(vm, iterator)?;

vm/src/pyobject.rs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1508,10 +1508,6 @@ pub enum PyObjectPayload {
15081508
counter: RefCell<BigInt>,
15091509
iterator: PyObjectRef,
15101510
},
1511-
FilterIterator {
1512-
predicate: PyObjectRef,
1513-
iterator: PyObjectRef,
1514-
},
15151511
Slice {
15161512
start: Option<BigInt>,
15171513
stop: Option<BigInt>,
@@ -1565,7 +1561,6 @@ impl fmt::Debug for PyObjectPayload {
15651561
PyObjectPayload::WeakRef { .. } => write!(f, "weakref"),
15661562
PyObjectPayload::Iterator { .. } => write!(f, "iterator"),
15671563
PyObjectPayload::EnumerateIterator { .. } => write!(f, "enumerate"),
1568-
PyObjectPayload::FilterIterator { .. } => write!(f, "filter"),
15691564
PyObjectPayload::Slice { .. } => write!(f, "slice"),
15701565
PyObjectPayload::Function { .. } => write!(f, "function"),
15711566
PyObjectPayload::Generator { .. } => write!(f, "generator"),

0 commit comments

Comments
 (0)