py: Change stream protocol API: fns return uint; is_text for text.
diff --git a/py/obj.h b/py/obj.h
index d0284e6..4745b76 100644
--- a/py/obj.h
+++ b/py/obj.h
@@ -228,13 +228,14 @@
 void mp_get_buffer_raise(mp_obj_t obj, mp_buffer_info_t *bufinfo, int flags);
 
 // Stream protocol
+#define MP_STREAM_ERROR (-1)
 typedef struct _mp_stream_p_t {
-    // On error, functions should return -1 and fill in *errcode (values are
-    // implementation-dependent, but will be exposed to user, e.g. via exception).
-    mp_int_t (*read)(mp_obj_t obj, void *buf, mp_uint_t size, int *errcode);
-    mp_int_t (*write)(mp_obj_t obj, const void *buf, mp_uint_t size, int *errcode);
+    // On error, functions should return MP_STREAM_ERROR and fill in *errcode (values
+    // are implementation-dependent, but will be exposed to user, e.g. via exception).
+    mp_uint_t (*read)(mp_obj_t obj, void *buf, mp_uint_t size, int *errcode);
+    mp_uint_t (*write)(mp_obj_t obj, const void *buf, mp_uint_t size, int *errcode);
     // add seek() ?
-    int is_bytes : 1;
+    int is_text : 1; // default is bytes, set this for text stream
 } mp_stream_p_t;
 
 struct _mp_obj_type_t {
diff --git a/py/objstringio.c b/py/objstringio.c
index bffdf2c..70f0c68 100644
--- a/py/objstringio.c
+++ b/py/objstringio.c
@@ -51,7 +51,7 @@
     print(env, self->base.type == &mp_type_stringio ? "<io.StringIO 0x%x>" : "<io.BytesIO 0x%x>", self->vstr);
 }
 
-STATIC mp_int_t stringio_read(mp_obj_t o_in, void *buf, mp_uint_t size, int *errcode) {
+STATIC mp_uint_t stringio_read(mp_obj_t o_in, void *buf, mp_uint_t size, int *errcode) {
     mp_obj_stringio_t *o = o_in;
     mp_uint_t remaining = o->vstr->len - o->pos;
     if (size > remaining) {
@@ -62,7 +62,7 @@
     return size;
 }
 
-STATIC mp_int_t stringio_write(mp_obj_t o_in, const void *buf, mp_uint_t size, int *errcode) {
+STATIC mp_uint_t stringio_write(mp_obj_t o_in, const void *buf, mp_uint_t size, int *errcode) {
     mp_obj_stringio_t *o = o_in;
     mp_uint_t remaining = o->vstr->alloc - o->pos;
     if (size > remaining) {
@@ -137,12 +137,12 @@
 STATIC const mp_stream_p_t stringio_stream_p = {
     .read = stringio_read,
     .write = stringio_write,
+    .is_text = true,
 };
 
 STATIC const mp_stream_p_t bytesio_stream_p = {
     .read = stringio_read,
     .write = stringio_write,
-    .is_bytes = true,
 };
 
 const mp_obj_type_t mp_type_stringio = {
diff --git a/py/stream.c b/py/stream.c
index ad5855c..09c39bd 100644
--- a/py/stream.c
+++ b/py/stream.c
@@ -58,7 +58,7 @@
 #define is_nonblocking_error(errno) (0)
 #endif
 
-#define STREAM_CONTENT_TYPE(stream) (((stream)->is_bytes) ? &mp_type_bytes : &mp_type_str)
+#define STREAM_CONTENT_TYPE(stream) (((stream)->is_text) ? &mp_type_str : &mp_type_bytes)
 
 STATIC mp_obj_t stream_read(uint n_args, const mp_obj_t *args) {
     struct _mp_obj_base_t *o = (struct _mp_obj_base_t *)args[0];
@@ -76,7 +76,7 @@
     }
 
     #if MICROPY_PY_BUILTINS_STR_UNICODE
-    if (!o->type->stream_p->is_bytes) {
+    if (o->type->stream_p->is_text) {
         // We need to read sz number of unicode characters.  Because we don't have any
         // buffering, and because the stream API can only read bytes, we must read here
         // in units of bytes and must never over read.  If we want sz chars, then reading
@@ -96,8 +96,8 @@
                 nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_MemoryError, "out of memory"));
             }
             int error;
-            mp_int_t out_sz = o->type->stream_p->read(o, p, more_bytes, &error);
-            if (out_sz == -1) {
+            mp_uint_t out_sz = o->type->stream_p->read(o, p, more_bytes, &error);
+            if (out_sz == MP_STREAM_ERROR) {
                 vstr_cut_tail_bytes(&vstr, more_bytes);
                 if (is_nonblocking_error(error)) {
                     // With non-blocking streams, we read as much as we can.
@@ -113,7 +113,7 @@
                 nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, "[Errno %d]", error));
             }
 
-            if ((mp_uint_t)out_sz < more_bytes) {
+            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 - out_sz);
@@ -168,8 +168,8 @@
 
     byte *buf = m_new(byte, sz);
     int error;
-    mp_int_t out_sz = o->type->stream_p->read(o, buf, sz, &error);
-    if (out_sz == -1) {
+    mp_uint_t out_sz = o->type->stream_p->read(o, buf, sz, &error);
+    if (out_sz == MP_STREAM_ERROR) {
         if (is_nonblocking_error(error)) {
             // https://docs.python.org/3.4/library/io.html#io.RawIOBase.read
             // "If the object is in non-blocking mode and no bytes are available,
@@ -194,8 +194,8 @@
     }
 
     int error;
-    mp_int_t out_sz = o->type->stream_p->write(self_in, buf, len, &error);
-    if (out_sz == -1) {
+    mp_uint_t out_sz = o->type->stream_p->write(self_in, buf, len, &error);
+    if (out_sz == MP_STREAM_ERROR) {
         if (is_nonblocking_error(error)) {
             // http://docs.python.org/3/library/io.html#io.RawIOBase.write
             // "None is returned if the raw stream is set not to block and
@@ -230,8 +230,8 @@
     int error;
     int current_read = DEFAULT_BUFFER_SIZE;
     while (true) {
-        mp_int_t out_sz = o->type->stream_p->read(self_in, p, current_read, &error);
-        if (out_sz == -1) {
+        mp_uint_t out_sz = o->type->stream_p->read(self_in, p, current_read, &error);
+        if (out_sz == MP_STREAM_ERROR) {
             if (is_nonblocking_error(error)) {
                 // With non-blocking streams, we read as much as we can.
                 // If we read nothing, return None, just like read().
@@ -292,16 +292,15 @@
             nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_MemoryError, "out of memory"));
         }
 
-        mp_int_t out_sz = o->type->stream_p->read(o, p, 1, &error);
-        if (out_sz == -1) {
+        mp_uint_t out_sz = o->type->stream_p->read(o, p, 1, &error);
+        if (out_sz == MP_STREAM_ERROR) {
             nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, "[Errno %d]", error));
         }
         if (out_sz == 0) {
             // Back out previously added byte
-            // TODO: This is a bit hacky, does it supported by vstr API contract?
             // Consider, what's better - read a char and get OutOfMemory (so read
             // char is lost), or allocate first as we do.
-            vstr_add_len(vstr, -1);
+            vstr_cut_tail_bytes(vstr, 1);
             break;
         }
         if (*p == '\n') {