summaryrefslogtreecommitdiff
path: root/py
diff options
context:
space:
mode:
Diffstat (limited to 'py')
-rw-r--r--py/modbuiltins.c1
-rw-r--r--py/moduerrno.c29
-rw-r--r--py/mperrno.h6
-rw-r--r--py/mpstate.h3
-rw-r--r--py/obj.h1
-rw-r--r--py/objexcept.c7
-rw-r--r--py/py.mk1
-rw-r--r--py/reload.c16
-rw-r--r--py/reload.h10
-rw-r--r--py/runtime.c6
10 files changed, 67 insertions, 13 deletions
diff --git a/py/modbuiltins.c b/py/modbuiltins.c
index 5e11b8d18..cea87b181 100644
--- a/py/modbuiltins.c
+++ b/py/modbuiltins.c
@@ -700,6 +700,7 @@ STATIC const mp_rom_map_elem_t mp_module_builtins_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR_IndentationError), MP_ROM_PTR(&mp_type_IndentationError) },
{ MP_ROM_QSTR(MP_QSTR_IndexError), MP_ROM_PTR(&mp_type_IndexError) },
{ MP_ROM_QSTR(MP_QSTR_KeyboardInterrupt), MP_ROM_PTR(&mp_type_KeyboardInterrupt) },
+ { MP_ROM_QSTR(MP_QSTR_ReloadException), MP_ROM_PTR(&mp_type_ReloadException) },
{ MP_ROM_QSTR(MP_QSTR_KeyError), MP_ROM_PTR(&mp_type_KeyError) },
{ MP_ROM_QSTR(MP_QSTR_LookupError), MP_ROM_PTR(&mp_type_LookupError) },
{ MP_ROM_QSTR(MP_QSTR_MemoryError), MP_ROM_PTR(&mp_type_MemoryError) },
diff --git a/py/moduerrno.c b/py/moduerrno.c
index de66c941b..660fca07a 100644
--- a/py/moduerrno.c
+++ b/py/moduerrno.c
@@ -30,8 +30,6 @@
#include "py/obj.h"
#include "py/mperrno.h"
-#if MICROPY_PY_UERRNO
-
// This list can be defined per port in mpconfigport.h to tailor it to a
// specific port's needs. If it's not defined then we provide a default.
#ifndef MICROPY_PY_UERRNO_LIST
@@ -61,6 +59,8 @@
#endif
+#if MICROPY_PY_UERRNO
+
#if MICROPY_PY_UERRNO_ERRORCODE
STATIC const mp_rom_map_elem_t errorcode_table[] = {
#define X(e) { MP_ROM_INT(MP_ ## e), MP_ROM_QSTR(MP_QSTR_## e) },
@@ -100,6 +100,20 @@ const mp_obj_module_t mp_module_uerrno = {
};
qstr mp_errno_to_str(mp_obj_t errno_val) {
+ // For commonly encountered errors, return human readable strings
+ if (MP_OBJ_IS_SMALL_INT(errno_val)) {
+ switch (MP_OBJ_SMALL_INT_VALUE(errno_val)) {
+ case EPERM: return MP_QSTR_Permission_space_denied;
+ case ENOENT: return MP_QSTR_No_space_such_space_file_slash_directory;
+ case EIO: return MP_QSTR_Input_slash_output_space_error;
+ case EACCES: return MP_QSTR_Permission_space_denied;
+ case EEXIST: return MP_QSTR_File_space_exists;
+ case ENODEV: return MP_QSTR_Unsupported_space_operation;
+ case EINVAL: return MP_QSTR_Invalid_space_argument;
+ }
+ }
+
+ // Otherwise, return the Exxxx string for that error code
#if MICROPY_PY_UERRNO_ERRORCODE
// We have the errorcode dict so can do a lookup using the hash map
mp_map_elem_t *elem = mp_map_lookup((mp_map_t*)&errorcode_dict.map, errno_val, MP_MAP_LOOKUP);
@@ -119,4 +133,15 @@ qstr mp_errno_to_str(mp_obj_t errno_val) {
#endif
}
+#else //MICROPY_PY_UERRNO
+
+qstr mp_errno_to_str(mp_obj_t errno_val) {
+ int v = MP_OBJ_SMALL_INT_VALUE(errno_val);
+ #define X(e) if (v == e) return (MP_QSTR_ ## e);
+ MICROPY_PY_UERRNO_LIST
+ #undef X
+
+ return MP_QSTR_;
+}
+
#endif //MICROPY_PY_UERRNO
diff --git a/py/mperrno.h b/py/mperrno.h
index caac116ab..a028157ba 100644
--- a/py/mperrno.h
+++ b/py/mperrno.h
@@ -142,12 +142,6 @@
#endif
-#if MICROPY_PY_UERRNO
-
-#include "py/obj.h"
-
qstr mp_errno_to_str(mp_obj_t errno_val);
-#endif
-
#endif // MICROPY_INCLUDED_PY_MPERRNO_H
diff --git a/py/mpstate.h b/py/mpstate.h
index 19a5d711e..c50947066 100644
--- a/py/mpstate.h
+++ b/py/mpstate.h
@@ -136,6 +136,9 @@ typedef struct _mp_state_vm_t {
mp_obj_exception_t mp_kbd_exception;
#endif
+ // exception object of type ReloadException
+ mp_obj_exception_t mp_reload_exception;
+
// dictionary with loaded modules (may be exposed as sys.modules)
mp_obj_dict_t mp_loaded_modules_dict;
diff --git a/py/obj.h b/py/obj.h
index e4d950b97..d086d3c14 100644
--- a/py/obj.h
+++ b/py/obj.h
@@ -590,6 +590,7 @@ extern const mp_obj_type_t mp_type_ImportError;
extern const mp_obj_type_t mp_type_IndentationError;
extern const mp_obj_type_t mp_type_IndexError;
extern const mp_obj_type_t mp_type_KeyboardInterrupt;
+extern const mp_obj_type_t mp_type_ReloadException;
extern const mp_obj_type_t mp_type_KeyError;
extern const mp_obj_type_t mp_type_LookupError;
extern const mp_obj_type_t mp_type_MemoryError;
diff --git a/py/objexcept.c b/py/objexcept.c
index 4844c7f92..f0874df77 100644
--- a/py/objexcept.c
+++ b/py/objexcept.c
@@ -113,7 +113,6 @@ STATIC void mp_obj_exception_print(const mp_print_t *print, mp_obj_t o_in, mp_pr
mp_print_str(print, "");
return;
} else if (o->args->len == 1) {
- #if MICROPY_PY_UERRNO
// try to provide a nice OSError error message
if (o->base.type == &mp_type_OSError && MP_OBJ_IS_SMALL_INT(o->args->items[0])) {
qstr qst = mp_errno_to_str(o->args->items[0]);
@@ -122,7 +121,6 @@ STATIC void mp_obj_exception_print(const mp_print_t *print, mp_obj_t o_in, mp_pr
return;
}
}
- #endif
mp_obj_print_helper(print, o->args->items[0], PRINT_STR);
return;
}
@@ -249,6 +247,7 @@ const mp_obj_type_t mp_type_ ## exc_name = { \
// http://docs.python.org/3/library/exceptions.html
MP_DEFINE_EXCEPTION(SystemExit, BaseException)
MP_DEFINE_EXCEPTION(KeyboardInterrupt, BaseException)
+MP_DEFINE_EXCEPTION(ReloadException, BaseException)
MP_DEFINE_EXCEPTION(GeneratorExit, BaseException)
MP_DEFINE_EXCEPTION(Exception, BaseException)
#if MICROPY_PY_ASYNC_AWAIT
@@ -275,9 +274,7 @@ MP_DEFINE_EXCEPTION(Exception, BaseException)
MP_DEFINE_EXCEPTION(UnboundLocalError, NameError)
*/
MP_DEFINE_EXCEPTION(OSError, Exception)
-#if MICROPY_PY_BUILTINS_TIMEOUTERROR
- MP_DEFINE_EXCEPTION(TimeoutError, OSError)
-#endif
+ MP_DEFINE_EXCEPTION(TimeoutError, OSError)
/*
MP_DEFINE_EXCEPTION(BlockingIOError, OSError)
MP_DEFINE_EXCEPTION(ChildProcessError, OSError)
diff --git a/py/py.mk b/py/py.mk
index 21f81c35d..e934c3a83 100644
--- a/py/py.mk
+++ b/py/py.mk
@@ -188,6 +188,7 @@ PY_O_BASENAME = \
objtype.o \
objzip.o \
opmethods.o \
+ reload.o \
sequence.o \
stream.o \
binary.o \
diff --git a/py/reload.c b/py/reload.c
new file mode 100644
index 000000000..95305f2c9
--- /dev/null
+++ b/py/reload.c
@@ -0,0 +1,16 @@
+//
+// Created by Roy Hooper on 2018-05-14.
+//
+
+#include "reload.h"
+#include "py/mpstate.h"
+
+void mp_raise_reload_exception(void) {
+ MP_STATE_VM(mp_pending_exception) = MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_reload_exception));
+#if MICROPY_ENABLE_SCHEDULER
+ if (MP_STATE_VM(sched_state) == MP_SCHED_IDLE) {
+ MP_STATE_VM(sched_state) = MP_SCHED_PENDING;
+ }
+#endif
+
+}
diff --git a/py/reload.h b/py/reload.h
new file mode 100644
index 000000000..72e84e5ca
--- /dev/null
+++ b/py/reload.h
@@ -0,0 +1,10 @@
+//
+// Created by Roy Hooper on 2018-05-14.
+//
+
+#ifndef CIRCUITPYTHON_RELOAD_H
+#define CIRCUITPYTHON_RELOAD_H
+
+void mp_raise_reload_exception(void);
+
+#endif //CIRCUITPYTHON_RELOAD_H
diff --git a/py/runtime.c b/py/runtime.c
index cbec82f17..a7ff57a47 100644
--- a/py/runtime.c
+++ b/py/runtime.c
@@ -84,6 +84,12 @@ void mp_init(void) {
MP_STATE_VM(mp_kbd_exception).args = (mp_obj_tuple_t*)&mp_const_empty_tuple_obj;
#endif
+ MP_STATE_VM(mp_reload_exception).base.type = &mp_type_ReloadException;
+ MP_STATE_VM(mp_reload_exception).traceback_alloc = 0;
+ MP_STATE_VM(mp_reload_exception).traceback_len = 0;
+ MP_STATE_VM(mp_reload_exception).traceback_data = NULL;
+ MP_STATE_VM(mp_reload_exception).args = (mp_obj_tuple_t*)&mp_const_empty_tuple_obj;
+
// call port specific initialization if any
#ifdef MICROPY_PORT_INIT_FUNC
MICROPY_PORT_INIT_FUNC;