2
2
3
3
use super :: os:: errno_err;
4
4
use crate :: {
5
- builtins:: { dict :: PyMapping , PyDictRef , PyStrRef } ,
5
+ builtins:: { PyListRef , PyStrRef } ,
6
6
exceptions:: IntoPyException ,
7
7
function:: OptionalArg ,
8
- PyObjectRef , PyResult , PySequence , TryFromObject , VirtualMachine ,
8
+ protocol:: PyMapping ,
9
+ ItemProtocol , PyObjectRef , PyResult , PySequence , TryFromObject , VirtualMachine ,
9
10
} ;
10
11
use std:: ptr:: { null, null_mut} ;
11
12
use winapi:: shared:: winerror;
@@ -155,7 +156,7 @@ fn _winapi_CreateProcess(
155
156
156
157
let mut env = args
157
158
. env_mapping
158
- . map ( |m| getenvironment ( m. into_dict ( ) , vm) )
159
+ . map ( |m| getenvironment ( m, vm) )
159
160
. transpose ( ) ?;
160
161
let env = env. as_mut ( ) . map_or_else ( null_mut, |v| v. as_mut_ptr ( ) ) ;
161
162
@@ -216,9 +217,21 @@ fn _winapi_CreateProcess(
216
217
) )
217
218
}
218
219
219
- fn getenvironment ( env : PyDictRef , vm : & VirtualMachine ) -> PyResult < Vec < u16 > > {
220
+ fn getenvironment ( env : PyMapping , vm : & VirtualMachine ) -> PyResult < Vec < u16 > > {
221
+ let keys = env. keys ( vm) ?;
222
+ let values = env. values ( vm) ?;
223
+
224
+ let keys = PyListRef :: try_from_object ( vm, keys) ?. borrow_vec ( ) . to_vec ( ) ;
225
+ let values = PyListRef :: try_from_object ( vm, values) ?
226
+ . borrow_vec ( )
227
+ . to_vec ( ) ;
228
+
229
+ if keys. len ( ) != values. len ( ) {
230
+ return Err ( vm. new_runtime_error ( "environment changed size during iteration" . to_owned ( ) ) ) ;
231
+ }
232
+
220
233
let mut out = widestring:: WideString :: new ( ) ;
221
- for ( k, v) in env {
234
+ for ( k, v) in keys . into_iter ( ) . zip ( values . into_iter ( ) ) {
222
235
let k = PyStrRef :: try_from_object ( vm, k) ?;
223
236
let k = k. as_str ( ) ;
224
237
let v = PyStrRef :: try_from_object ( vm, v) ?;
@@ -252,10 +265,11 @@ impl Drop for AttrList {
252
265
253
266
fn getattributelist ( obj : PyObjectRef , vm : & VirtualMachine ) -> PyResult < Option < AttrList > > {
254
267
<Option < PyMapping > >:: try_from_object ( vm, obj) ?
255
- . map ( |d| {
256
- let d = d. into_dict ( ) ;
257
- let handlelist = d
258
- . get_item_option ( "handle_list" , vm) ?
268
+ . map ( |mapping| {
269
+ let handlelist = mapping
270
+ . into_object ( )
271
+ . get_item ( "handle_list" , vm)
272
+ . ok ( )
259
273
. and_then ( |obj| {
260
274
<Option < PySequence < usize > > >:: try_from_object ( vm, obj)
261
275
. map ( |s| match s {
@@ -265,6 +279,7 @@ fn getattributelist(obj: PyObjectRef, vm: &VirtualMachine) -> PyResult<Option<At
265
279
. transpose ( )
266
280
} )
267
281
. transpose ( ) ?;
282
+
268
283
let attr_count = handlelist. is_some ( ) as u32 ;
269
284
let mut size = 0 ;
270
285
let ret = unsafe {
0 commit comments