Skip to content

Commit 0ce30aa

Browse files
committed
Fix more test_io
1 parent c6f2e73 commit 0ce30aa

File tree

3 files changed

+50
-23
lines changed

3 files changed

+50
-23
lines changed

Lib/test/test_io.py

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1843,10 +1843,6 @@ def test_bad_readinto_type(self):
18431843
def test_error_through_destructor(self):
18441844
return super().test_error_through_destructor()
18451845

1846-
@unittest.expectedFailure # TODO: RUSTPYTHON
1847-
def test_seek_character_device_file(self):
1848-
return super().test_seek_character_device_file()
1849-
18501846
def test_truncate_on_read_only(self):
18511847
return super().test_truncate_on_read_only()
18521848

@@ -2699,10 +2695,6 @@ def test_args_error(self):
26992695
def test_error_through_destructor(self):
27002696
return super().test_error_through_destructor()
27012697

2702-
@unittest.expectedFailure # TODO: RUSTPYTHON
2703-
def test_seek_character_device_file(self):
2704-
return super().test_seek_character_device_file()
2705-
27062698
@unittest.skip('TODO: RUSTPYTHON; fallible allocation')
27072699
def test_constructor(self):
27082700
return super().test_constructor()

crates/derive-impl/src/pystructseq.rs

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -316,20 +316,53 @@ pub(crate) fn impl_pystruct_sequence_data(
316316

317317
// Generate try_from_elements trait override only when try_from_object=true
318318
let try_from_elements_trait_override = if try_from_object {
319-
let visible_field_idents: Vec<_> = visible_fields.iter().map(|f| &f.ident).collect();
320-
let skipped_field_idents: Vec<_> = skipped_fields.iter().map(|f| &f.ident).collect();
319+
let visible_field_inits: Vec<_> = visible_fields
320+
.iter()
321+
.map(|f| {
322+
let ident = &f.ident;
323+
let cfg_attrs = &f.cfg_attrs;
324+
if cfg_attrs.is_empty() {
325+
quote! { #ident: iter.next().unwrap().clone().try_into_value(vm)?, }
326+
} else {
327+
quote! {
328+
#(#cfg_attrs)*
329+
#ident: iter.next().unwrap().clone().try_into_value(vm)?,
330+
}
331+
}
332+
})
333+
.collect();
334+
let skipped_field_inits: Vec<_> = skipped_fields
335+
.iter()
336+
.map(|f| {
337+
let ident = &f.ident;
338+
let cfg_attrs = &f.cfg_attrs;
339+
if cfg_attrs.is_empty() {
340+
quote! {
341+
#ident: match iter.next() {
342+
Some(v) => v.clone().try_into_value(vm)?,
343+
None => vm.ctx.none(),
344+
},
345+
}
346+
} else {
347+
quote! {
348+
#(#cfg_attrs)*
349+
#ident: match iter.next() {
350+
Some(v) => v.clone().try_into_value(vm)?,
351+
None => vm.ctx.none(),
352+
},
353+
}
354+
}
355+
})
356+
.collect();
321357
quote! {
322358
fn try_from_elements(
323359
elements: Vec<::rustpython_vm::PyObjectRef>,
324360
vm: &::rustpython_vm::VirtualMachine,
325361
) -> ::rustpython_vm::PyResult<Self> {
326362
let mut iter = elements.into_iter();
327363
Ok(Self {
328-
#(#visible_field_idents: iter.next().unwrap().clone().try_into_value(vm)?,)*
329-
#(#skipped_field_idents: match iter.next() {
330-
Some(v) => v.clone().try_into_value(vm)?,
331-
None => vm.ctx.none(),
332-
},)*
364+
#(#visible_field_inits)*
365+
#(#skipped_field_inits)*
333366
})
334367
}
335368
}

crates/vm/src/stdlib/io.rs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1000,7 +1000,10 @@ mod _io {
10001000
};
10011001
if offset >= -self.pos && offset <= available {
10021002
self.pos += offset;
1003-
return Ok(current - available + offset);
1003+
// GH-95782: character devices may report raw position 0
1004+
// even after reading, which would make this negative
1005+
let result = current - available + offset;
1006+
return Ok(if result < 0 { 0 } else { result });
10041007
}
10051008
}
10061009
}
@@ -1835,10 +1838,9 @@ mod _io {
18351838
Self::WRITABLE
18361839
}
18371840

1838-
// TODO: this should be the default for an equivalent of _PyObject_GetState
18391841
#[pymethod]
1840-
fn __reduce__(zelf: PyObjectRef, vm: &VirtualMachine) -> PyResult {
1841-
Err(vm.new_type_error(format!("cannot pickle '{}' object", zelf.class().name())))
1842+
fn __getstate__(zelf: PyObjectRef, vm: &VirtualMachine) -> PyResult {
1843+
Err(vm.new_type_error(format!("cannot pickle '{}' instances", zelf.class().name())))
18421844
}
18431845
}
18441846

@@ -3460,8 +3462,8 @@ mod _io {
34603462
}
34613463

34623464
#[pymethod]
3463-
fn __reduce__(zelf: PyObjectRef, vm: &VirtualMachine) -> PyResult {
3464-
Err(vm.new_type_error(format!("cannot pickle '{}' object", zelf.class().name())))
3465+
fn __getstate__(zelf: PyObjectRef, vm: &VirtualMachine) -> PyResult {
3466+
Err(vm.new_type_error(format!("cannot pickle '{}' instances", zelf.class().name())))
34653467
}
34663468
}
34673469

@@ -5199,8 +5201,8 @@ mod fileio {
51995201
}
52005202

52015203
#[pymethod]
5202-
fn __reduce__(zelf: PyObjectRef, vm: &VirtualMachine) -> PyResult {
5203-
Err(vm.new_type_error(format!("cannot pickle '{}' object", zelf.class().name())))
5204+
fn __getstate__(zelf: PyObjectRef, vm: &VirtualMachine) -> PyResult {
5205+
Err(vm.new_type_error(format!("cannot pickle '{}' instances", zelf.class().name())))
52045206
}
52055207
}
52065208

0 commit comments

Comments
 (0)