@@ -37,15 +37,15 @@ macro_rules! extract_dict_keys {
37
37
( $py: expr, $obj: expr) => {
38
38
$obj. downcast:: <PyDictKeys >( )
39
39
. ok( )
40
- . map( |v| PyIterator :: from_object ( v) . unwrap( ) )
40
+ . map( |v| PyIterator :: from_object2 ( v) . unwrap( ) )
41
41
} ;
42
42
}
43
43
44
44
#[ cfg( PyPy ) ]
45
45
macro_rules! extract_dict_keys {
46
46
( $py: expr, $obj: expr) => {
47
47
if is_dict_keys_type( $obj) {
48
- Some ( PyIterator :: from_object ( $obj) . unwrap( ) )
48
+ Some ( PyIterator :: from_object2 ( $obj) . unwrap( ) )
49
49
} else {
50
50
None
51
51
}
@@ -57,15 +57,15 @@ macro_rules! extract_dict_values {
57
57
( $py: expr, $obj: expr) => {
58
58
$obj. downcast:: <PyDictValues >( )
59
59
. ok( )
60
- . map( |v| PyIterator :: from_object ( v) . unwrap( ) )
60
+ . map( |v| PyIterator :: from_object2 ( v) . unwrap( ) )
61
61
} ;
62
62
}
63
63
64
64
#[ cfg( PyPy ) ]
65
65
macro_rules! extract_dict_values {
66
66
( $py: expr, $obj: expr) => {
67
67
if is_dict_values_type( $obj) {
68
- Some ( PyIterator :: from_object ( $obj) . unwrap( ) )
68
+ Some ( PyIterator :: from_object2 ( $obj) . unwrap( ) )
69
69
} else {
70
70
None
71
71
}
@@ -77,15 +77,15 @@ macro_rules! extract_dict_items {
77
77
( $py: expr, $obj: expr) => {
78
78
$obj. downcast:: <PyDictItems >( )
79
79
. ok( )
80
- . map( |v| PyIterator :: from_object ( v) . unwrap( ) )
80
+ . map( |v| PyIterator :: from_object2 ( v) . unwrap( ) )
81
81
} ;
82
82
}
83
83
84
84
#[ cfg( PyPy ) ]
85
85
macro_rules! extract_dict_items {
86
86
( $py: expr, $obj: expr) => {
87
87
if is_dict_items_type( $obj) {
88
- Some ( PyIterator :: from_object ( $obj) . unwrap( ) )
88
+ Some ( PyIterator :: from_object2 ( $obj) . unwrap( ) )
89
89
} else {
90
90
None
91
91
}
@@ -246,7 +246,7 @@ impl<'a> Input<'a> for PyAny {
246
246
247
247
fn exact_str ( & ' a self ) -> ValResult < EitherString < ' a > > {
248
248
if let Ok ( py_str) = <PyString as PyTryFrom >:: try_from_exact ( self ) {
249
- Ok ( EitherString :: Py ( py_str) )
249
+ Ok ( EitherString :: Py ( Py2 :: borrowed_from_gil_ref ( & py_str) . clone ( ) ) )
250
250
} else {
251
251
Err ( ValError :: new ( ErrorTypeDefaults :: IntType , self ) )
252
252
}
@@ -550,31 +550,35 @@ impl<'a> Input<'a> for PyAny {
550
550
if let Ok ( iterable) = self . downcast :: < PyList > ( ) {
551
551
Ok ( GenericIterable :: List ( Py2 :: borrowed_from_gil_ref ( & iterable) . clone ( ) ) )
552
552
} else if let Ok ( iterable) = self . downcast :: < PyTuple > ( ) {
553
- Ok ( GenericIterable :: Tuple ( iterable) )
553
+ Ok ( GenericIterable :: Tuple ( Py2 :: borrowed_from_gil_ref ( & iterable) . clone ( ) ) )
554
554
} else if let Ok ( iterable) = self . downcast :: < PySet > ( ) {
555
- Ok ( GenericIterable :: Set ( iterable) )
555
+ Ok ( GenericIterable :: Set ( Py2 :: borrowed_from_gil_ref ( & iterable) . clone ( ) ) )
556
556
} else if let Ok ( iterable) = self . downcast :: < PyFrozenSet > ( ) {
557
- Ok ( GenericIterable :: FrozenSet ( iterable) )
557
+ Ok ( GenericIterable :: FrozenSet (
558
+ Py2 :: borrowed_from_gil_ref ( & iterable) . clone ( ) ,
559
+ ) )
558
560
} else if let Ok ( iterable) = self . downcast :: < PyDict > ( ) {
559
- Ok ( GenericIterable :: Dict ( iterable) )
560
- } else if let Some ( iterable) = extract_dict_keys ! ( self . py( ) , self ) {
561
+ Ok ( GenericIterable :: Dict ( Py2 :: borrowed_from_gil_ref ( & iterable) . clone ( ) ) )
562
+ } else if let Some ( iterable) = extract_dict_keys ! ( self . py( ) , Py2 :: borrowed_from_gil_ref ( & self ) ) {
561
563
Ok ( GenericIterable :: DictKeys ( iterable) )
562
- } else if let Some ( iterable) = extract_dict_values ! ( self . py( ) , self ) {
564
+ } else if let Some ( iterable) = extract_dict_values ! ( self . py( ) , Py2 :: borrowed_from_gil_ref ( & self ) ) {
563
565
Ok ( GenericIterable :: DictValues ( iterable) )
564
- } else if let Some ( iterable) = extract_dict_items ! ( self . py( ) , self ) {
566
+ } else if let Some ( iterable) = extract_dict_items ! ( self . py( ) , Py2 :: borrowed_from_gil_ref ( & self ) ) {
565
567
Ok ( GenericIterable :: DictItems ( iterable) )
566
568
} else if let Ok ( iterable) = self . downcast :: < PyMapping > ( ) {
567
- Ok ( GenericIterable :: Mapping ( iterable) )
569
+ Ok ( GenericIterable :: Mapping ( Py2 :: borrowed_from_gil_ref ( & iterable) . clone ( ) ) )
568
570
} else if let Ok ( iterable) = self . downcast :: < PyString > ( ) {
569
- Ok ( GenericIterable :: PyString ( iterable) )
571
+ Ok ( GenericIterable :: PyString ( Py2 :: borrowed_from_gil_ref ( & iterable) . clone ( ) ) )
570
572
} else if let Ok ( iterable) = self . downcast :: < PyBytes > ( ) {
571
- Ok ( GenericIterable :: Bytes ( iterable) )
573
+ Ok ( GenericIterable :: Bytes ( Py2 :: borrowed_from_gil_ref ( & iterable) . clone ( ) ) )
572
574
} else if let Ok ( iterable) = self . downcast :: < PyByteArray > ( ) {
573
- Ok ( GenericIterable :: PyByteArray ( iterable) )
575
+ Ok ( GenericIterable :: PyByteArray (
576
+ Py2 :: borrowed_from_gil_ref ( & iterable) . clone ( ) ,
577
+ ) )
574
578
} else if let Ok ( iterable) = self . downcast :: < PySequence > ( ) {
575
- Ok ( GenericIterable :: Sequence ( iterable) )
579
+ Ok ( GenericIterable :: Sequence ( Py2 :: borrowed_from_gil_ref ( & iterable) . clone ( ) ) )
576
580
} else if let Ok ( iterable) = self . iter ( ) {
577
- Ok ( GenericIterable :: Iterator ( iterable) )
581
+ Ok ( GenericIterable :: Iterator ( Py2 :: borrowed_from_gil_ref ( & iterable) . clone ( ) ) )
578
582
} else {
579
583
Err ( ValError :: new ( ErrorTypeDefaults :: IterableType , self ) )
580
584
}
@@ -864,7 +868,7 @@ impl<'a> Input<'a> for Py2<'a, PyAny> {
864
868
865
869
fn exact_str ( & ' a self ) -> ValResult < EitherString < ' a > > {
866
870
if let Ok ( py_str) = self . downcast_exact :: < PyString > ( ) {
867
- Ok ( EitherString :: Py ( py_str. as_gil_ref ( ) ) )
871
+ Ok ( EitherString :: Py ( py_str. clone ( ) ) )
868
872
} else {
869
873
Err ( ValError :: new ( ErrorTypeDefaults :: IntType , self ) )
870
874
}
@@ -1168,30 +1172,30 @@ impl<'a> Input<'a> for Py2<'a, PyAny> {
1168
1172
if let Ok ( iterable) = self . downcast :: < PyList > ( ) {
1169
1173
Ok ( GenericIterable :: List ( iterable. clone ( ) ) )
1170
1174
} else if let Ok ( iterable) = self . downcast :: < PyTuple > ( ) {
1171
- Ok ( GenericIterable :: Tuple ( iterable. as_gil_ref ( ) ) )
1175
+ Ok ( GenericIterable :: Tuple ( iterable. clone ( ) ) )
1172
1176
} else if let Ok ( iterable) = self . downcast :: < PySet > ( ) {
1173
- Ok ( GenericIterable :: Set ( iterable. as_gil_ref ( ) ) )
1177
+ Ok ( GenericIterable :: Set ( iterable. clone ( ) ) )
1174
1178
} else if let Ok ( iterable) = self . downcast :: < PyFrozenSet > ( ) {
1175
- Ok ( GenericIterable :: FrozenSet ( iterable. as_gil_ref ( ) ) )
1179
+ Ok ( GenericIterable :: FrozenSet ( iterable. clone ( ) ) )
1176
1180
} else if let Ok ( iterable) = self . downcast :: < PyDict > ( ) {
1177
- Ok ( GenericIterable :: Dict ( iterable. as_gil_ref ( ) ) )
1178
- } else if let Some ( iterable) = extract_dict_keys ! ( self . py( ) , self . as_gil_ref ( ) ) {
1181
+ Ok ( GenericIterable :: Dict ( iterable. clone ( ) ) )
1182
+ } else if let Some ( iterable) = extract_dict_keys ! ( self . py( ) , self ) {
1179
1183
Ok ( GenericIterable :: DictKeys ( iterable) )
1180
- } else if let Some ( iterable) = extract_dict_values ! ( self . py( ) , self . as_gil_ref ( ) ) {
1184
+ } else if let Some ( iterable) = extract_dict_values ! ( self . py( ) , self ) {
1181
1185
Ok ( GenericIterable :: DictValues ( iterable) )
1182
- } else if let Some ( iterable) = extract_dict_items ! ( self . py( ) , self . as_gil_ref ( ) ) {
1186
+ } else if let Some ( iterable) = extract_dict_items ! ( self . py( ) , self ) {
1183
1187
Ok ( GenericIterable :: DictItems ( iterable) )
1184
- } else if let Ok ( iterable) = self . as_gil_ref ( ) . downcast :: < PyMapping > ( ) {
1185
- Ok ( GenericIterable :: Mapping ( iterable) )
1188
+ } else if let Ok ( iterable) = self . downcast :: < PyMapping > ( ) {
1189
+ Ok ( GenericIterable :: Mapping ( iterable. clone ( ) ) )
1186
1190
} else if let Ok ( iterable) = self . downcast :: < PyString > ( ) {
1187
- Ok ( GenericIterable :: PyString ( iterable. as_gil_ref ( ) ) )
1191
+ Ok ( GenericIterable :: PyString ( iterable. clone ( ) ) )
1188
1192
} else if let Ok ( iterable) = self . downcast :: < PyBytes > ( ) {
1189
- Ok ( GenericIterable :: Bytes ( iterable. as_gil_ref ( ) ) )
1193
+ Ok ( GenericIterable :: Bytes ( iterable. clone ( ) ) )
1190
1194
} else if let Ok ( iterable) = self . downcast :: < PyByteArray > ( ) {
1191
- Ok ( GenericIterable :: PyByteArray ( iterable. as_gil_ref ( ) ) )
1192
- } else if let Ok ( iterable) = self . as_gil_ref ( ) . downcast :: < PySequence > ( ) {
1193
- Ok ( GenericIterable :: Sequence ( iterable) )
1194
- } else if let Ok ( iterable) = self . as_gil_ref ( ) . iter ( ) {
1195
+ Ok ( GenericIterable :: PyByteArray ( iterable. clone ( ) ) )
1196
+ } else if let Ok ( iterable) = self . downcast :: < PySequence > ( ) {
1197
+ Ok ( GenericIterable :: Sequence ( iterable. clone ( ) ) )
1198
+ } else if let Ok ( iterable) = self . iter ( ) {
1195
1199
Ok ( GenericIterable :: Iterator ( iterable) )
1196
1200
} else {
1197
1201
Err ( ValError :: new ( ErrorTypeDefaults :: IterableType , self ) )
@@ -1352,6 +1356,13 @@ impl BorrowInput for Py2<'_, PyAny> {
1352
1356
}
1353
1357
}
1354
1358
1359
+ impl BorrowInput for Py2Borrowed < ' _ , ' _ , PyAny > {
1360
+ type Input < ' a > = Py2 < ' a , PyAny > where Self : ' a ;
1361
+ fn borrow_input ( & self ) -> & Self :: Input < ' _ > {
1362
+ self
1363
+ }
1364
+ }
1365
+
1355
1366
/// Best effort check of whether it's likely to make sense to inspect obj for attributes and iterate over it
1356
1367
/// with `obj.dir()`
1357
1368
fn from_attributes_applicable ( obj : & PyAny ) -> bool {
0 commit comments