summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--py/stream.c10
-rw-r--r--tests/io/file_long_read.py3
2 files changed, 9 insertions, 4 deletions
diff --git a/py/stream.c b/py/stream.c
index 4c8b8a570a..5b5fa90df4 100644
--- a/py/stream.c
+++ b/py/stream.c
@@ -97,7 +97,7 @@ STATIC mp_obj_t stream_read(uint n_args, const mp_obj_t *args) {
}
int error;
mp_int_t out_sz = o->type->stream_p->read(o, p, more_bytes, &error);
- if (out_sz == -1) {
+ if (out_sz < 0) {
vstr_cut_tail_bytes(&vstr, more_bytes);
if (is_nonblocking_error(error)) {
// With non-blocking streams, we read as much as we can.
@@ -113,11 +113,13 @@ STATIC mp_obj_t stream_read(uint n_args, const mp_obj_t *args) {
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, "[Errno %d]", error));
}
- if (out_sz == 0) {
+ if (out_sz < more_bytes) {
// Finish reading.
// TODO what if we have read only half a non-ASCII char?
- vstr_cut_tail_bytes(&vstr, more_bytes);
- break;
+ vstr_cut_tail_bytes(&vstr, more_bytes - out_sz);
+ if (out_sz == 0) {
+ break;
+ }
}
// count chars from bytes just read
diff --git a/tests/io/file_long_read.py b/tests/io/file_long_read.py
new file mode 100644
index 0000000000..8bdd484504
--- /dev/null
+++ b/tests/io/file_long_read.py
@@ -0,0 +1,3 @@
+f = open("io/data/file1")
+b = f.read(100)
+print(len(b))