1
- use super :: objbool;
2
- use super :: objiter;
3
1
use crate :: pyobject:: {
4
- IdProtocol , PyContext , PyFuncArgs , PyObject , PyObjectPayload , PyResult , TypeProtocol ,
2
+ IdProtocol , PyContext , PyFuncArgs , PyObject , PyObjectPayload , PyObjectPayload2 , PyObjectRef ,
3
+ PyResult , TypeProtocol ,
5
4
} ;
6
5
use crate :: vm:: VirtualMachine ; // Required for arg_check! to use isinstance
7
6
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
+
8
22
fn filter_new ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
9
23
arg_check ! (
10
24
vm,
@@ -13,9 +27,11 @@ fn filter_new(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
13
27
) ;
14
28
let iterator = objiter:: get_iter ( vm, iterable) ?;
15
29
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
+ } ) ,
19
35
} ,
20
36
cls. clone ( ) ,
21
37
) )
@@ -24,10 +40,10 @@ fn filter_new(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
24
40
fn filter_next ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
25
41
arg_check ! ( vm, args, required = [ ( filter, Some ( vm. ctx. filter_type( ) ) ) ] ) ;
26
42
27
- if let PyObjectPayload :: FilterIterator {
43
+ if let Some ( PyFilter {
28
44
ref predicate,
29
45
ref iterator,
30
- } = filter. payload
46
+ } ) = filter. payload ( )
31
47
{
32
48
loop {
33
49
let next_obj = objiter:: call_next ( vm, iterator) ?;
0 commit comments