| 4498 | |
| 4499 | #[pymethod] |
| 4500 | fn __setstate__(zelf: PyRef<Self>, state: PyTupleRef, vm: &VirtualMachine) -> PyResult<()> { |
| 4501 | // Check closed state first (like CHECK_CLOSED) |
| 4502 | if zelf.closed.load() { |
| 4503 | return Err(vm.new_value_error("__setstate__ on closed file")); |
| 4504 | } |
| 4505 | if state.len() != 4 { |
| 4506 | return Err(vm.new_type_error(format!( |
| 4507 | "__setstate__ argument should be 4-tuple, got {}", |
| 4508 | state.len() |
| 4509 | ))); |
| 4510 | } |
| 4511 | |
| 4512 | let content: PyStrRef = state[0].clone().try_into_value(vm)?; |
| 4513 | // state[1] is newline - TODO: use when newline handling is implemented |
| 4514 | let pos: u64 = state[2].clone().try_into_value(vm)?; |
| 4515 | let dict = &state[3]; |
| 4516 | |
| 4517 | // Set content and position |
| 4518 | let raw_bytes = content.as_bytes().to_vec(); |
| 4519 | let mut buffer = zelf.buffer.write(); |
| 4520 | *buffer = BufferedIO::new(Cursor::new(raw_bytes)); |
| 4521 | buffer |
| 4522 | .seek(SeekFrom::Start(pos)) |
| 4523 | .map_err(|err| os_err(vm, err))?; |
| 4524 | drop(buffer); |
| 4525 | |
| 4526 | // Set __dict__ if provided |
| 4527 | if !vm.is_none(dict) { |
| 4528 | let dict_ref: PyRef<PyDict> = dict.clone().try_into_value(vm)?; |
| 4529 | if let Some(obj_dict) = zelf.as_object().dict() { |
| 4530 | obj_dict.clear(); |
| 4531 | for (key, value) in dict_ref.into_iter() { |
| 4532 | obj_dict.set_item(&*key, value, vm)?; |
| 4533 | } |
| 4534 | } |
| 4535 | } |
| 4536 | |
| 4537 | Ok(()) |
| 4538 | } |
| 4539 | } |
| 4540 | |
| 4541 | #[derive(FromArgs)] |