summaryrefslogtreecommitdiff
path: root/py
diff options
context:
space:
mode:
Diffstat (limited to 'py')
-rw-r--r--py/moduerrno.c37
-rw-r--r--py/mperrno.h3
-rw-r--r--py/objexcept.c39
-rw-r--r--py/py.mk2
-rw-r--r--py/stream.c6
-rw-r--r--py/stream.h1
6 files changed, 61 insertions, 27 deletions
diff --git a/py/moduerrno.c b/py/moduerrno.c
index 255c1a73e..c1feafaa1 100644
--- a/py/moduerrno.c
+++ b/py/moduerrno.c
@@ -136,19 +136,28 @@ const char* mp_errno_to_str(mp_obj_t errno_val) {
#endif //MICROPY_PY_UERRNO
-// For commonly encountered errors, return human readable strings
-const compressed_string_t* mp_common_errno_to_str(mp_obj_t errno_val) {
- if (MP_OBJ_IS_SMALL_INT(errno_val)) {
- switch (MP_OBJ_SMALL_INT_VALUE(errno_val)) {
- case EPERM: return translate("Permission denied");
- case ENOENT: return translate("No such file/directory");
- case EIO: return translate("Input/output error");
- case EACCES: return translate("Permission denied");
- case EEXIST: return translate("File exists");
- case ENODEV: return translate("Unsupported operation");
- case EINVAL: return translate("Invalid argument");
- case EROFS: return translate("Read-only filesystem");
- }
+// For commonly encountered errors, return human readable strings, otherwise try errno name
+const char *mp_common_errno_to_str(mp_obj_t errno_val, char *buf, size_t len) {
+ if (!MP_OBJ_IS_SMALL_INT(errno_val)) {
+ return NULL;
+ }
+
+ const compressed_string_t* desc = NULL;
+ switch (MP_OBJ_SMALL_INT_VALUE(errno_val)) {
+ case EPERM: desc = translate("Permission denied"); break;
+ case ENOENT: desc = translate("No such file/directory"); break;
+ case EIO: desc = translate("Input/output error"); break;
+ case EACCES: desc = translate("Permission denied"); break;
+ case EEXIST: desc = translate("File exists"); break;
+ case ENODEV: desc = translate("Unsupported operation"); break;
+ case EINVAL: desc = translate("Invalid argument"); break;
+ case EROFS: desc = translate("Read-only filesystem"); break;
}
- return NULL;
+ if (desc != NULL && desc->length <= len) {
+ decompress(desc, buf);
+ return buf;
+ }
+
+ const char *msg = mp_errno_to_str(errno_val);
+ return msg[0] != '\0' ? msg : NULL;
}
diff --git a/py/mperrno.h b/py/mperrno.h
index 876b090b5..911a9b413 100644
--- a/py/mperrno.h
+++ b/py/mperrno.h
@@ -141,7 +141,6 @@
#endif
const char* mp_errno_to_str(mp_obj_t errno_val);
-// For commonly encountered errors, return compressed human readable strings
-const compressed_string_t* mp_common_errno_to_str(mp_obj_t errno_val);
+const char *mp_common_errno_to_str(mp_obj_t errno_val, char *buf, size_t len);
#endif // MICROPY_INCLUDED_PY_MPERRNO_H
diff --git a/py/objexcept.c b/py/objexcept.c
index 1ddc2174e..c54e5fd4a 100644
--- a/py/objexcept.c
+++ b/py/objexcept.c
@@ -114,17 +114,11 @@ void mp_obj_exception_print(const mp_print_t *print, mp_obj_t o_in, mp_print_kin
return;
} else if (o->args->len == 1) {
// try to provide a nice OSError error message
- if (o->base.type == &mp_type_OSError && MP_OBJ_IS_SMALL_INT(o->args->items[0])) {
- const compressed_string_t* common = mp_common_errno_to_str(o->args->items[0]);
- const char* msg;
+ if (MP_OBJ_IS_SMALL_INT(o->args->items[0]) &&
+ mp_obj_is_subclass_fast(MP_OBJ_FROM_PTR(o->base.type), MP_OBJ_FROM_PTR(&mp_type_OSError))) {
char decompressed[50];
- if (common != NULL && common->length <= 50) {
- decompress(common, decompressed);
- msg = decompressed;
- } else {
- msg = mp_errno_to_str(o->args->items[0]);
- }
- if (msg[0] != '\0') {
+ const char *msg = mp_common_errno_to_str(o->args->items[0], decompressed, sizeof(decompressed));
+ if (msg != NULL) {
mp_printf(print, "[Errno " INT_FMT "] %s", MP_OBJ_SMALL_INT_VALUE(o->args->items[0]), msg);
return;
}
@@ -215,6 +209,31 @@ void mp_obj_exception_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) {
dest[0] = MP_OBJ_FROM_PTR(self->args);
} else if (self->base.type == &mp_type_StopIteration && attr == MP_QSTR_value) {
dest[0] = mp_obj_exception_get_value(self_in);
+ #if MICROPY_CPYTHON_COMPAT
+ } else if (mp_obj_is_subclass_fast(MP_OBJ_FROM_PTR(self->base.type), MP_OBJ_FROM_PTR(&mp_type_OSError))) {
+ if (attr == MP_QSTR_errno) {
+ dest[0] = mp_obj_exception_get_value(self_in);
+ } else if (attr == MP_QSTR_strerror) {
+ if (self->args->len > 1) {
+ dest[0] = self->args->items[1];
+ } else if (self->args->len > 0) {
+ char decompressed[50];
+ const char *msg = mp_common_errno_to_str(self->args->items[0], decompressed, sizeof(decompressed));
+ if (msg != NULL) {
+ dest[0] = mp_obj_new_str(msg, strlen(msg));
+ } else {
+ dest[0] = mp_const_none;
+ }
+ } else {
+ dest[0] = mp_const_none;
+ }
+ } else if (attr == MP_QSTR_filename) {
+ dest[0] = self->args->len > 2 ? self->args->items[2] : mp_const_none;
+ // skip winerror
+ } else if (attr == MP_QSTR_filename2) {
+ dest[0] = self->args->len > 4 ? self->args->items[4] : mp_const_none;
+ }
+ #endif
}
}
diff --git a/py/py.mk b/py/py.mk
index c640e6cff..69ad4e9b9 100644
--- a/py/py.mk
+++ b/py/py.mk
@@ -28,7 +28,7 @@ ifeq ($(MICROPY_PY_USSL),1)
CFLAGS_MOD += -DMICROPY_PY_USSL=1
ifeq ($(MICROPY_SSL_AXTLS),1)
CFLAGS_MOD += -DMICROPY_SSL_AXTLS=1 -I$(TOP)/lib/axtls/ssl -I$(TOP)/lib/axtls/crypto -I$(TOP)/lib/axtls/config
-LDFLAGS_MOD += -Lbuild -laxtls
+LDFLAGS_MOD += -L$(BUILD) -laxtls
else ifeq ($(MICROPY_SSL_MBEDTLS),1)
# Can be overridden by ports which have "builtin" mbedTLS
MICROPY_SSL_MBEDTLS_INCLUDE ?= $(TOP)/lib/mbedtls/include
diff --git a/py/stream.c b/py/stream.c
index 8cf375b16..aca9b8460 100644
--- a/py/stream.c
+++ b/py/stream.c
@@ -250,6 +250,9 @@ void mp_stream_write_adaptor(void *self, const char *buf, size_t len) {
STATIC mp_obj_t stream_write_method(size_t n_args, const mp_obj_t *args) {
mp_buffer_info_t bufinfo;
mp_get_buffer_raise(args[1], &bufinfo, MP_BUFFER_READ);
+ if (!mp_get_stream(args[0])->is_text && MP_OBJ_IS_STR(args[1])) {
+ mp_raise_ValueError(translate("string not supported; use bytes or bytearray"));
+ }
size_t max_len = (size_t)-1;
size_t off = 0;
if (n_args == 3) {
@@ -282,6 +285,9 @@ STATIC mp_obj_t stream_readinto(size_t n_args, const mp_obj_t *args) {
// https://docs.python.org/3/library/socket.html#socket.socket.recv_into
mp_uint_t len = bufinfo.len;
if (n_args > 2) {
+ if (mp_get_stream(args[0])->pyserial_compatibility) {
+ mp_raise_ValueError(translate("length argument not allowed for this type"));
+ }
len = mp_obj_get_int(args[2]);
if (len > bufinfo.len) {
len = bufinfo.len;
diff --git a/py/stream.h b/py/stream.h
index 7b953138c..bcba4f234 100644
--- a/py/stream.h
+++ b/py/stream.h
@@ -70,6 +70,7 @@ typedef struct _mp_stream_p_t {
mp_uint_t (*write)(mp_obj_t obj, const void *buf, mp_uint_t size, int *errcode);
mp_uint_t (*ioctl)(mp_obj_t obj, mp_uint_t request, uintptr_t arg, int *errcode);
mp_uint_t is_text : 1; // default is bytes, set this for text stream
+ bool pyserial_compatibility: 1; // adjust API to match pyserial more closely
} mp_stream_p_t;
MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(mp_stream_read_obj);