summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien George <damien@micropython.org>2024-05-17 10:43:34 +1000
committerDamien George <damien@micropython.org>2024-05-23 14:20:20 +1000
commit482292cc664be63af985b5bde3a5c83ddcc9180a (patch)
tree3cb725d4f19ce29de0ca4b0afade29f06476972d
parenta919ce26d325b0169a5cfaf65fe4a71ece9dfa1f (diff)
py/dynruntime: Add mp_obj_exception_init function to create C exception.
Signed-off-by: Damien George <damien@micropython.org>
-rw-r--r--py/dynruntime.h15
-rw-r--r--py/nativeglue.c1
-rw-r--r--py/nativeglue.h1
-rwxr-xr-xtools/mpy_ld.py1
4 files changed, 18 insertions, 0 deletions
diff --git a/py/dynruntime.h b/py/dynruntime.h
index d07b1dce2..5503a1014 100644
--- a/py/dynruntime.h
+++ b/py/dynruntime.h
@@ -90,6 +90,7 @@ static inline void *m_realloc_dyn(void *ptr, size_t new_num_bytes) {
#define mp_type_bytes (*(mp_obj_type_t *)(mp_load_global(MP_QSTR_bytes)))
#define mp_type_tuple (*((mp_obj_base_t *)mp_const_empty_tuple)->type)
#define mp_type_list (*mp_fun_table.type_list)
+#define mp_type_Exception (*mp_fun_table.type_Exception)
#define mp_type_EOFError (*(mp_obj_type_t *)(mp_load_global(MP_QSTR_EOFError)))
#define mp_type_IndexError (*(mp_obj_type_t *)(mp_load_global(MP_QSTR_IndexError)))
#define mp_type_KeyError (*(mp_obj_type_t *)(mp_load_global(MP_QSTR_KeyError)))
@@ -236,6 +237,10 @@ static inline void *mp_obj_malloc_helper_dyn(size_t num_bytes, const mp_obj_type
/******************************************************************************/
// Exceptions
+#define mp_obj_exception_make_new (MP_OBJ_TYPE_GET_SLOT(&mp_type_Exception, make_new))
+#define mp_obj_exception_print (MP_OBJ_TYPE_GET_SLOT(&mp_type_Exception, print))
+#define mp_obj_exception_attr (MP_OBJ_TYPE_GET_SLOT(&mp_type_Exception, attr))
+
#define mp_obj_new_exception(o) ((mp_obj_t)(o)) // Assumes returned object will be raised, will create instance then
#define mp_obj_new_exception_arg1(e_type, arg) (mp_obj_new_exception_arg1_dyn((e_type), (arg)))
@@ -263,6 +268,16 @@ static inline void mp_raise_OSError_dyn(int er) {
nlr_raise(mp_call_function_n_kw(mp_load_global(MP_QSTR_OSError), 1, 0, &args[0]));
}
+static inline void mp_obj_exception_init(mp_obj_full_type_t *exc, qstr name, const mp_obj_type_t *base) {
+ exc->base.type = &mp_type_type;
+ exc->flags = MP_TYPE_FLAG_NONE;
+ exc->name = name;
+ MP_OBJ_TYPE_SET_SLOT(exc, make_new, mp_obj_exception_make_new, 0);
+ MP_OBJ_TYPE_SET_SLOT(exc, print, mp_obj_exception_print, 1);
+ MP_OBJ_TYPE_SET_SLOT(exc, attr, mp_obj_exception_attr, 2);
+ MP_OBJ_TYPE_SET_SLOT(exc, parent, base, 3);
+}
+
/******************************************************************************/
// Floating point
diff --git a/py/nativeglue.c b/py/nativeglue.c
index ba3d93f76..ad2483cae 100644
--- a/py/nativeglue.c
+++ b/py/nativeglue.c
@@ -344,6 +344,7 @@ const mp_fun_table_t mp_fun_table = {
&mp_type_fun_builtin_2,
&mp_type_fun_builtin_3,
&mp_type_fun_builtin_var,
+ &mp_type_Exception,
&mp_stream_read_obj,
&mp_stream_readinto_obj,
&mp_stream_unbuffered_readline_obj,
diff --git a/py/nativeglue.h b/py/nativeglue.h
index 1fa859334..4c114de42 100644
--- a/py/nativeglue.h
+++ b/py/nativeglue.h
@@ -171,6 +171,7 @@ typedef struct _mp_fun_table_t {
const mp_obj_type_t *type_fun_builtin_2;
const mp_obj_type_t *type_fun_builtin_3;
const mp_obj_type_t *type_fun_builtin_var;
+ const mp_obj_type_t *type_Exception;
const mp_obj_fun_builtin_var_t *stream_read_obj;
const mp_obj_fun_builtin_var_t *stream_readinto_obj;
const mp_obj_fun_builtin_var_t *stream_unbuffered_readline_obj;
diff --git a/tools/mpy_ld.py b/tools/mpy_ld.py
index 2e3da53eb..029b02fa4 100755
--- a/tools/mpy_ld.py
+++ b/tools/mpy_ld.py
@@ -767,6 +767,7 @@ def link_objects(env, native_qstr_vals_len):
"mp_type_fun_builtin_2",
"mp_type_fun_builtin_3",
"mp_type_fun_builtin_var",
+ "mp_type_Exception",
"mp_stream_read_obj",
"mp_stream_readinto_obj",
"mp_stream_unbuffered_readline_obj",