| 1150 | |
| 1151 | #[pymethod] |
| 1152 | fn readline(&self, vm: &VirtualMachine) -> PyResult<PyBytesRef> { |
| 1153 | let pos = self.pos(); |
| 1154 | let mmap = self.check_valid(vm)?; |
| 1155 | |
| 1156 | let remaining = self.__len__().saturating_sub(pos); |
| 1157 | if remaining == 0 { |
| 1158 | return Ok(PyBytes::from(vec![]).into_ref(&vm.ctx)); |
| 1159 | } |
| 1160 | |
| 1161 | let slice = mmap.as_ref().unwrap().as_slice(); |
| 1162 | let eof = slice[pos..].iter().position(|&x| x == b'\n'); |
| 1163 | |
| 1164 | let end_pos = if let Some(i) = eof { |
| 1165 | pos + i + 1 |
| 1166 | } else { |
| 1167 | self.__len__() |
| 1168 | }; |
| 1169 | |
| 1170 | let bytes = slice[pos..end_pos].to_vec(); |
| 1171 | |
| 1172 | let result = PyBytes::from(bytes).into_ref(&vm.ctx); |
| 1173 | |
| 1174 | self.advance_pos(end_pos - pos); |
| 1175 | |
| 1176 | Ok(result) |
| 1177 | } |
| 1178 | |
| 1179 | #[cfg(unix)] |
| 1180 | #[pymethod] |