diff options
author | Damien George <damien.p.george@gmail.com> | 2020-02-11 11:48:28 +1100 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2020-02-13 11:52:40 +1100 |
commit | ad7213d3c31bccb26a3f54f7492ccf4b0cc920f3 (patch) | |
tree | 2ab64a805c05d790579052f557a8168061afcebe /py | |
parent | 97eca38c4f03e76bd464fb25974544a043af2a9e (diff) |
py: Add mp_raise_msg_varg helper and use it where appropriate.
This commit adds mp_raise_msg_varg(type, fmt, ...) as a helper for
nlr_raise(mp_obj_new_exception_msg_varg(type, fmt, ...)). It makes the
C-level API for raising exceptions more consistent, and reduces code size
on most ports:
bare-arm: +28 +0.042%
minimal x86: +100 +0.067%
unix x64: -56 -0.011%
unix nanbox: -300 -0.068%
stm32: -204 -0.054% PYBV10
cc3200: +0 +0.000%
esp8266: -64 -0.010% GENERIC
esp32: -104 -0.007% GENERIC
nrf: -136 -0.094% pca10040
samd: +0 +0.000% ADAFRUIT_ITSYBITSY_M4_EXPRESS
Diffstat (limited to 'py')
-rw-r--r-- | py/argcheck.c | 15 | ||||
-rw-r--r-- | py/bc.c | 24 | ||||
-rw-r--r-- | py/builtinimport.c | 6 | ||||
-rw-r--r-- | py/modbuiltins.c | 4 | ||||
-rw-r--r-- | py/obj.c | 39 | ||||
-rw-r--r-- | py/obj.h | 3 | ||||
-rw-r--r-- | py/objexcept.c | 13 | ||||
-rw-r--r-- | py/objnamedtuple.c | 15 | ||||
-rw-r--r-- | py/objstr.c | 24 | ||||
-rw-r--r-- | py/objstrunicode.c | 2 | ||||
-rw-r--r-- | py/objtype.c | 15 | ||||
-rw-r--r-- | py/runtime.c | 71 | ||||
-rw-r--r-- | py/runtime.h | 1 |
13 files changed, 120 insertions, 112 deletions
diff --git a/py/argcheck.c b/py/argcheck.c index c2b1b6c07..3b3f9eea8 100644 --- a/py/argcheck.c +++ b/py/argcheck.c @@ -50,9 +50,9 @@ void mp_arg_check_num_sig(size_t n_args, size_t n_kw, uint32_t sig) { if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { mp_arg_error_terse_mismatch(); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, + mp_raise_msg_varg(&mp_type_TypeError, "function takes %d positional arguments but %d were given", - n_args_min, n_args)); + n_args_min, n_args); } } } else { @@ -60,17 +60,17 @@ void mp_arg_check_num_sig(size_t n_args, size_t n_kw, uint32_t sig) { if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { mp_arg_error_terse_mismatch(); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, + mp_raise_msg_varg(&mp_type_TypeError, "function missing %d required positional arguments", - n_args_min - n_args)); + n_args_min - n_args); } } else if (n_args > n_args_max) { if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { mp_arg_error_terse_mismatch(); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, + mp_raise_msg_varg(&mp_type_TypeError, "function expected at most %d arguments, got %d", - n_args_max, n_args)); + n_args_max, n_args); } } } @@ -93,8 +93,7 @@ void mp_arg_parse_all(size_t n_pos, const mp_obj_t *pos, mp_map_t *kws, size_t n if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { mp_arg_error_terse_mismatch(); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, - "'%q' argument required", allowed[i].qst)); + mp_raise_msg_varg(&mp_type_TypeError, "'%q' argument required", allowed[i].qst); } } out_vals[i] = allowed[i].defval; @@ -83,12 +83,12 @@ STATIC NORETURN void fun_pos_args_mismatch(mp_obj_fun_bc_t *f, size_t expected, mp_arg_error_terse_mismatch(); #elif MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_NORMAL (void)f; - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, - "function takes %d positional arguments but %d were given", expected, given)); + mp_raise_msg_varg(&mp_type_TypeError, + "function takes %d positional arguments but %d were given", expected, given); #elif MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_DETAILED - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, + mp_raise_msg_varg(&mp_type_TypeError, "%q() takes %d positional arguments but %d were given", - mp_obj_fun_get_name(MP_OBJ_FROM_PTR(f)), expected, given)); + mp_obj_fun_get_name(MP_OBJ_FROM_PTR(f)), expected, given); #endif } @@ -203,8 +203,8 @@ void mp_setup_code_state(mp_code_state_t *code_state, size_t n_args, size_t n_kw for (size_t j = 0; j < n_pos_args + n_kwonly_args; j++) { if (wanted_arg_name == arg_names[j]) { if (code_state->state[n_state - 1 - j] != MP_OBJ_NULL) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, - "function got multiple values for argument '%q'", MP_OBJ_QSTR_VALUE(wanted_arg_name))); + mp_raise_msg_varg(&mp_type_TypeError, + "function got multiple values for argument '%q'", MP_OBJ_QSTR_VALUE(wanted_arg_name)); } code_state->state[n_state - 1 - j] = kwargs[2 * i + 1]; goto continue2; @@ -215,8 +215,8 @@ void mp_setup_code_state(mp_code_state_t *code_state, size_t n_args, size_t n_kw if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { mp_raise_TypeError("unexpected keyword argument"); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, - "unexpected keyword argument '%q'", MP_OBJ_QSTR_VALUE(wanted_arg_name))); + mp_raise_msg_varg(&mp_type_TypeError, + "unexpected keyword argument '%q'", MP_OBJ_QSTR_VALUE(wanted_arg_name)); } } mp_obj_dict_store(dict, kwargs[2 * i], kwargs[2 * i + 1]); @@ -241,8 +241,8 @@ continue2:; // Check that all mandatory positional args are specified while (d < &code_state->state[n_state]) { if (*d++ == MP_OBJ_NULL) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, - "function missing required positional argument #%d", &code_state->state[n_state] - d)); + mp_raise_msg_varg(&mp_type_TypeError, + "function missing required positional argument #%d", &code_state->state[n_state] - d); } } @@ -257,8 +257,8 @@ continue2:; if (elem != NULL) { code_state->state[n_state - 1 - n_pos_args - i] = elem->value; } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, - "function missing required keyword argument '%q'", MP_OBJ_QSTR_VALUE(arg_names[n_pos_args + i]))); + mp_raise_msg_varg(&mp_type_TypeError, + "function missing required keyword argument '%q'", MP_OBJ_QSTR_VALUE(arg_names[n_pos_args + i])); } } } diff --git a/py/builtinimport.c b/py/builtinimport.c index 9d91b2059..aef1a8017 100644 --- a/py/builtinimport.c +++ b/py/builtinimport.c @@ -401,8 +401,7 @@ mp_obj_t mp_builtin___import__(size_t n_args, const mp_obj_t *args) { if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { mp_raise_msg(&mp_type_ImportError, "module not found"); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ImportError, - "no module named '%q'", mod_name)); + mp_raise_msg_varg(&mp_type_ImportError, "no module named '%q'", mod_name); } } } else { @@ -505,8 +504,7 @@ mp_obj_t mp_builtin___import__(size_t n_args, const mp_obj_t *args) { if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { mp_raise_msg(&mp_type_ImportError, "module not found"); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ImportError, - "no module named '%q'", module_name_qstr)); + mp_raise_msg_varg(&mp_type_ImportError, "no module named '%q'", module_name_qstr); } } diff --git a/py/modbuiltins.c b/py/modbuiltins.c index d12af4c2f..6065bfd61 100644 --- a/py/modbuiltins.c +++ b/py/modbuiltins.c @@ -374,8 +374,8 @@ STATIC mp_obj_t mp_builtin_ord(mp_obj_t o_in) { if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { mp_raise_TypeError("ord expects a character"); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, - "ord() expected a character, but string of length %d found", (int)len)); + mp_raise_msg_varg(&mp_type_TypeError, + "ord() expected a character, but string of length %d found", (int)len); } } MP_DEFINE_CONST_FUN_OBJ_1(mp_builtin_ord_obj, mp_builtin_ord); @@ -362,8 +362,8 @@ mp_float_t mp_obj_get_float(mp_obj_t arg) { if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { mp_raise_TypeError("can't convert to float"); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, - "can't convert %s to float", mp_obj_get_type_str(arg))); + mp_raise_msg_varg(&mp_type_TypeError, + "can't convert %s to float", mp_obj_get_type_str(arg)); } } @@ -395,8 +395,8 @@ void mp_obj_get_complex(mp_obj_t arg, mp_float_t *real, mp_float_t *imag) { if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { mp_raise_TypeError("can't convert to complex"); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, - "can't convert %s to complex", mp_obj_get_type_str(arg))); + mp_raise_msg_varg(&mp_type_TypeError, + "can't convert %s to complex", mp_obj_get_type_str(arg)); } } } @@ -413,8 +413,8 @@ void mp_obj_get_array(mp_obj_t o, size_t *len, mp_obj_t **items) { if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { mp_raise_TypeError("expected tuple/list"); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, - "object '%s' isn't a tuple or list", mp_obj_get_type_str(o))); + mp_raise_msg_varg(&mp_type_TypeError, + "object '%s' isn't a tuple or list", mp_obj_get_type_str(o)); } } } @@ -427,8 +427,8 @@ void mp_obj_get_array_fixed_n(mp_obj_t o, size_t len, mp_obj_t **items) { if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { mp_raise_ValueError("tuple/list has wrong length"); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, - "requested length %d but object has length %d", (int)len, (int)seq_len)); + mp_raise_msg_varg(&mp_type_ValueError, + "requested length %d but object has length %d", (int)len, (int)seq_len); } } } @@ -442,9 +442,9 @@ size_t mp_get_index(const mp_obj_type_t *type, size_t len, mp_obj_t index, bool if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { mp_raise_TypeError("indices must be integers"); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, + mp_raise_msg_varg(&mp_type_TypeError, "%q indices must be integers, not %s", - type->name, mp_obj_get_type_str(index))); + type->name, mp_obj_get_type_str(index)); } } @@ -462,8 +462,7 @@ size_t mp_get_index(const mp_obj_type_t *type, size_t len, mp_obj_t index, bool if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { mp_raise_msg(&mp_type_IndexError, "index out of range"); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_IndexError, - "%q index out of range", type->name)); + mp_raise_msg_varg(&mp_type_IndexError, "%q index out of range", type->name); } } } @@ -497,8 +496,8 @@ mp_obj_t mp_obj_len(mp_obj_t o_in) { if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { mp_raise_TypeError("object has no len"); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, - "object of type '%s' has no len()", mp_obj_get_type_str(o_in))); + mp_raise_msg_varg(&mp_type_TypeError, + "object of type '%s' has no len()", mp_obj_get_type_str(o_in)); } } else { return len; @@ -538,22 +537,22 @@ mp_obj_t mp_obj_subscr(mp_obj_t base, mp_obj_t index, mp_obj_t value) { if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { mp_raise_TypeError("object doesn't support item deletion"); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, - "'%s' object doesn't support item deletion", mp_obj_get_type_str(base))); + mp_raise_msg_varg(&mp_type_TypeError, + "'%s' object doesn't support item deletion", mp_obj_get_type_str(base)); } } else if (value == MP_OBJ_SENTINEL) { if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { mp_raise_TypeError("object isn't subscriptable"); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, - "'%s' object isn't subscriptable", mp_obj_get_type_str(base))); + mp_raise_msg_varg(&mp_type_TypeError, + "'%s' object isn't subscriptable", mp_obj_get_type_str(base)); } } else { if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { mp_raise_TypeError("object doesn't support item assignment"); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, - "'%s' object doesn't support item assignment", mp_obj_get_type_str(base))); + mp_raise_msg_varg(&mp_type_TypeError, + "'%s' object doesn't support item assignment", mp_obj_get_type_str(base)); } } } @@ -712,6 +712,9 @@ mp_obj_t mp_obj_new_exception_arg1(const mp_obj_type_t *exc_type, mp_obj_t arg); mp_obj_t mp_obj_new_exception_args(const mp_obj_type_t *exc_type, size_t n_args, const mp_obj_t *args); mp_obj_t mp_obj_new_exception_msg(const mp_obj_type_t *exc_type, const char *msg); mp_obj_t mp_obj_new_exception_msg_varg(const mp_obj_type_t *exc_type, const char *fmt, ...); // counts args by number of % symbols in fmt, excluding %%; can only handle void* sizes (ie no float/double!) +#ifdef va_start +mp_obj_t mp_obj_new_exception_msg_varg2(const mp_obj_type_t *exc_type, const char *fmt, va_list arg); // counts args by number of % symbols in fmt, excluding %%; can only handle void* sizes (ie no float/double!) +#endif mp_obj_t mp_obj_new_fun_bc(mp_obj_t def_args, mp_obj_t def_kw_args, const byte *code, const mp_uint_t *const_table); mp_obj_t mp_obj_new_fun_native(mp_obj_t def_args_in, mp_obj_t def_kw_args, const void *fun_data, const mp_uint_t *const_table); mp_obj_t mp_obj_new_fun_asm(size_t n_args, const void *fun_data, mp_uint_t type_sig); diff --git a/py/objexcept.c b/py/objexcept.c index 33ad74ee7..30592fd56 100644 --- a/py/objexcept.c +++ b/py/objexcept.c @@ -385,6 +385,14 @@ STATIC void exc_add_strn(void *data, const char *str, size_t len) { } mp_obj_t mp_obj_new_exception_msg_varg(const mp_obj_type_t *exc_type, const char *fmt, ...) { + va_list args; + va_start(args, fmt); + mp_obj_t exc = mp_obj_new_exception_msg_varg2(exc_type, fmt, args); + va_end(args); + return exc; +} + +mp_obj_t mp_obj_new_exception_msg_varg2(const mp_obj_type_t *exc_type, const char *fmt, va_list args) { assert(fmt != NULL); // Check that the given type is an exception type @@ -425,10 +433,7 @@ mp_obj_t mp_obj_new_exception_msg_varg(const mp_obj_type_t *exc_type, const char // We have some memory to format the string struct _exc_printer_t exc_pr = {!used_emg_buf, o_str_alloc, 0, o_str_buf}; mp_print_t print = {&exc_pr, exc_add_strn}; - va_list ap; - va_start(ap, fmt); - mp_vprintf(&print, fmt, ap); - va_end(ap); + mp_vprintf(&print, fmt, args); exc_pr.buf[exc_pr.len] = '\0'; o_str->len = exc_pr.len; o_str->data = exc_pr.buf; diff --git a/py/objnamedtuple.c b/py/objnamedtuple.c index 3e0f66139..8e714aa32 100644 --- a/py/objnamedtuple.c +++ b/py/objnamedtuple.c @@ -98,13 +98,13 @@ STATIC mp_obj_t namedtuple_make_new(const mp_obj_type_t *type_in, size_t n_args, if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { mp_arg_error_terse_mismatch(); } else if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_NORMAL) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, + mp_raise_msg_varg(&mp_type_TypeError, "function takes %d positional arguments but %d were given", - num_fields, n_args + n_kw)); + num_fields, n_args + n_kw); } else if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_DETAILED) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, + mp_raise_msg_varg(&mp_type_TypeError, "%q() takes %d positional arguments but %d were given", - type->base.name, num_fields, n_args + n_kw)); + type->base.name, num_fields, n_args + n_kw); } } @@ -124,16 +124,15 @@ STATIC mp_obj_t namedtuple_make_new(const mp_obj_type_t *type_in, size_t n_args, if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { mp_arg_error_terse_mismatch(); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, - "unexpected keyword argument '%q'", kw)); + mp_raise_msg_varg(&mp_type_TypeError, "unexpected keyword argument '%q'", kw); } } if (tuple->items[id] != MP_OBJ_NULL) { if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { mp_arg_error_terse_mismatch(); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, - "function got multiple values for argument '%q'", kw)); + mp_raise_msg_varg(&mp_type_TypeError, + "function got multiple values for argument '%q'", kw); } } tuple->items[id] = args[i + 1]; diff --git a/py/objstr.c b/py/objstr.c index 7e7e86ddd..7919a4d44 100644 --- a/py/objstr.c +++ b/py/objstr.c @@ -1001,8 +1001,8 @@ STATIC vstr_t mp_obj_str_format_helper(const char *str, const char *top, int *ar mp_raise_ValueError( "end of format while looking for conversion specifier"); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, - "unknown conversion specifier %c", *str)); + mp_raise_msg_varg(&mp_type_ValueError, + "unknown conversion specifier %c", *str); } } } @@ -1262,9 +1262,9 @@ STATIC vstr_t mp_obj_str_format_helper(const char *str, const char *top, int *ar if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { terse_str_format_value_error(); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, + mp_raise_msg_varg(&mp_type_ValueError, "unknown format code '%c' for object of type '%s'", - type, mp_obj_get_type_str(arg))); + type, mp_obj_get_type_str(arg)); } } } @@ -1334,9 +1334,9 @@ STATIC vstr_t mp_obj_str_format_helper(const char *str, const char *top, int *ar if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { terse_str_format_value_error(); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, + mp_raise_msg_varg(&mp_type_ValueError, "unknown format code '%c' for object of type '%s'", - type, mp_obj_get_type_str(arg))); + type, mp_obj_get_type_str(arg)); } } } else { @@ -1370,9 +1370,9 @@ STATIC vstr_t mp_obj_str_format_helper(const char *str, const char *top, int *ar if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { terse_str_format_value_error(); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, + mp_raise_msg_varg(&mp_type_ValueError, "unknown format code '%c' for object of type '%s'", - type, mp_obj_get_type_str(arg))); + type, mp_obj_get_type_str(arg)); } } } @@ -1574,9 +1574,9 @@ not_enough_args: if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { terse_str_format_value_error(); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, + mp_raise_msg_varg(&mp_type_ValueError, "unsupported format character '%c' (0x%x) at index %d", - *str, *str, str - start_str)); + *str, *str, str - start_str); } } } @@ -2112,9 +2112,9 @@ STATIC NORETURN void bad_implicit_conversion(mp_obj_t self_in) { mp_raise_TypeError("can't convert to str implicitly"); } else { const qstr src_name = mp_obj_get_type(self_in)->name; - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, + mp_raise_msg_varg(&mp_type_TypeError, "can't convert '%q' object to %q implicitly", - src_name, src_name == MP_QSTR_str ? MP_QSTR_bytes : MP_QSTR_str)); + src_name, src_name == MP_QSTR_str ? MP_QSTR_bytes : MP_QSTR_str); } } diff --git a/py/objstrunicode.c b/py/objstrunicode.c index e5a57ab94..c9bd6ee59 100644 --- a/py/objstrunicode.c +++ b/py/objstrunicode.c @@ -129,7 +129,7 @@ const byte *str_index_to_ptr(const mp_obj_type_t *type, const byte *self_data, s if (mp_obj_is_small_int(index)) { i = MP_OBJ_SMALL_INT_VALUE(index); } else if (!mp_obj_get_int_maybe(index, &i)) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "string indices must be integers, not %s", mp_obj_get_type_str(index))); + mp_raise_msg_varg(&mp_type_TypeError, "string indices must be integers, not %s", mp_obj_get_type_str(index)); } const byte *s, *top = self_data + self_len; if (i < 0) diff --git a/py/objtype.c b/py/objtype.c index 57cfeeccb..b2c2f58d9 100644 --- a/py/objtype.c +++ b/py/objtype.c @@ -351,8 +351,8 @@ mp_obj_t mp_obj_instance_make_new(const mp_obj_type_t *self, size_t n_args, size if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { mp_raise_TypeError("__init__() should return None"); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, - "__init__() should return None, not '%s'", mp_obj_get_type_str(init_ret))); + mp_raise_msg_varg(&mp_type_TypeError, + "__init__() should return None, not '%s'", mp_obj_get_type_str(init_ret)); } } @@ -867,8 +867,8 @@ mp_obj_t mp_obj_instance_call(mp_obj_t self_in, size_t n_args, size_t n_kw, cons if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { mp_raise_TypeError("object not callable"); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, - "'%s' object isn't callable", mp_obj_get_type_str(self_in))); + mp_raise_msg_varg(&mp_type_TypeError, + "'%s' object isn't callable", mp_obj_get_type_str(self_in)); } } mp_obj_instance_t *self = MP_OBJ_TO_PTR(self_in); @@ -992,8 +992,7 @@ STATIC mp_obj_t type_call(mp_obj_t self_in, size_t n_args, size_t n_kw, const mp if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { mp_raise_TypeError("cannot create instance"); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, - "cannot create '%q' instances", self->name)); + mp_raise_msg_varg(&mp_type_TypeError, "cannot create '%q' instances", self->name); } } @@ -1115,8 +1114,8 @@ mp_obj_t mp_obj_new_type(qstr name, mp_obj_t bases_tuple, mp_obj_t locals_dict) if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { mp_raise_TypeError("type isn't an acceptable base type"); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, - "type '%q' isn't an acceptable base type", t->name)); + mp_raise_msg_varg(&mp_type_TypeError, + "type '%q' isn't an acceptable base type", t->name); } } #if ENABLE_SPECIAL_ACCESSORS diff --git a/py/runtime.c b/py/runtime.c index 4a718c1e2..e824421f7 100644 --- a/py/runtime.c +++ b/py/runtime.c @@ -25,6 +25,7 @@ * THE SOFTWARE. */ +#include <stdarg.h> #include <stdio.h> #include <string.h> #include <assert.h> @@ -187,8 +188,7 @@ mp_obj_t mp_load_global(qstr qst) { if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { mp_raise_msg(&mp_type_NameError, "name not defined"); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_NameError, - "name '%q' isn't defined", qst)); + mp_raise_msg_varg(&mp_type_NameError, "name '%q' isn't defined", qst); } } } @@ -293,12 +293,12 @@ mp_obj_t mp_unary_op(mp_unary_op_t op, mp_obj_t arg) { } } else { if (op == MP_UNARY_OP_INT) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, - "can't convert %s to int", mp_obj_get_type_str(arg))); + mp_raise_msg_varg(&mp_type_TypeError, + "can't convert %s to int", mp_obj_get_type_str(arg)); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, + mp_raise_msg_varg(&mp_type_TypeError, "unsupported type for %q: '%s'", - mp_unary_op_method_name[op], mp_obj_get_type_str(arg))); + mp_unary_op_method_name[op], mp_obj_get_type_str(arg)); } } } @@ -593,9 +593,9 @@ unsupported_op: if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { mp_raise_TypeError("unsupported type for operator"); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, + mp_raise_msg_varg(&mp_type_TypeError, "unsupported types for %q: '%s', '%s'", - mp_binary_op_method_name[op], mp_obj_get_type_str(lhs), mp_obj_get_type_str(rhs))); + mp_binary_op_method_name[op], mp_obj_get_type_str(lhs), mp_obj_get_type_str(rhs)); } zero_division: @@ -635,8 +635,8 @@ mp_obj_t mp_call_function_n_kw(mp_obj_t fun_in, size_t n_args, size_t n_kw, cons if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { mp_raise_TypeError("object not callable"); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, - "'%s' object isn't callable", mp_obj_get_type_str(fun_in))); + mp_raise_msg_varg(&mp_type_TypeError, + "'%s' object isn't callable", mp_obj_get_type_str(fun_in)); } } @@ -864,15 +864,13 @@ too_short: if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { mp_raise_ValueError("wrong number of values to unpack"); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, - "need more than %d values to unpack", (int)seq_len)); + mp_raise_msg_varg(&mp_type_ValueError, "need more than %d values to unpack", (int)seq_len); } too_long: if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { mp_raise_ValueError("wrong number of values to unpack"); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, - "too many values to unpack (expected %d)", (int)num)); + mp_raise_msg_varg(&mp_type_ValueError, "too many values to unpack (expected %d)", (int)num); } } @@ -933,8 +931,7 @@ too_short: if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { mp_raise_ValueError("wrong number of values to unpack"); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, - "need more than %d values to unpack", (int)seq_len)); + mp_raise_msg_varg(&mp_type_ValueError, "need more than %d values to unpack", (int)seq_len); } } @@ -972,8 +969,8 @@ STATIC mp_obj_t checked_fun_call(mp_obj_t self_in, size_t n_args, size_t n_kw, c if (MICROPY_ERROR_REPORTING != MICROPY_ERROR_REPORTING_DETAILED) { mp_raise_TypeError("argument has wrong type"); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, - "argument should be a '%q' not a '%q'", self->type->name, arg0_type->name)); + mp_raise_msg_varg(&mp_type_TypeError, + "argument should be a '%q' not a '%q'", self->type->name, arg0_type->name); } } } @@ -1097,13 +1094,13 @@ void mp_load_method(mp_obj_t base, qstr attr, mp_obj_t *dest) { } else { // following CPython, we give a more detailed error message for type objects if (mp_obj_is_type(base, &mp_type_type)) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_AttributeError, + mp_raise_msg_varg(&mp_type_AttributeError, "type object '%q' has no attribute '%q'", - ((mp_obj_type_t*)MP_OBJ_TO_PTR(base))->name, attr)); + ((mp_obj_type_t*)MP_OBJ_TO_PTR(base))->name, attr); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_AttributeError, + mp_raise_msg_varg(&mp_type_AttributeError, "'%s' object has no attribute '%q'", - mp_obj_get_type_str(base), attr)); + mp_obj_get_type_str(base), attr); } } } @@ -1139,9 +1136,9 @@ void mp_store_attr(mp_obj_t base, qstr attr, mp_obj_t value) { if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { mp_raise_msg(&mp_type_AttributeError, "no such attribute"); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_AttributeError, + mp_raise_msg_varg(&mp_type_AttributeError, "'%s' object has no attribute '%q'", - mp_obj_get_type_str(base), attr)); + mp_obj_get_type_str(base), attr); } } @@ -1184,8 +1181,8 @@ mp_obj_t mp_getiter(mp_obj_t o_in, mp_obj_iter_buf_t *iter_buf) { if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { mp_raise_TypeError("object not iterable"); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, - "'%s' object isn't iterable", mp_obj_get_type_str(o_in))); + mp_raise_msg_varg(&mp_type_TypeError, + "'%s' object isn't iterable", mp_obj_get_type_str(o_in)); } } @@ -1206,8 +1203,8 @@ mp_obj_t mp_iternext_allow_raise(mp_obj_t o_in) { if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { mp_raise_TypeError("object not an iterator"); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, - "'%s' object isn't an iterator", mp_obj_get_type_str(o_in))); + mp_raise_msg_varg(&mp_type_TypeError, + "'%s' object isn't an iterator", mp_obj_get_type_str(o_in)); } } } @@ -1242,8 +1239,8 @@ mp_obj_t mp_iternext(mp_obj_t o_in) { if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { mp_raise_TypeError("object not an iterator"); } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, - "'%s' object isn't an iterator", mp_obj_get_type_str(o_in))); + mp_raise_msg_varg(&mp_type_TypeError, + "'%s' object isn't an iterator", mp_obj_get_type_str(o_in)); } } } @@ -1378,7 +1375,7 @@ mp_obj_t mp_import_from(mp_obj_t module, qstr name) { if (dest[1] != MP_OBJ_NULL) { // Hopefully we can't import bound method from an object import_error: - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ImportError, "cannot import name %q", name)); + mp_raise_msg_varg(&mp_type_ImportError, "cannot import name %q", name); } if (dest[0] != MP_OBJ_NULL) { @@ -1482,8 +1479,8 @@ NORETURN void m_malloc_fail(size_t num_bytes) { mp_raise_msg(&mp_type_MemoryError, "memory allocation failed, heap is locked"); } #endif - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_MemoryError, - "memory allocation failed, allocating %u bytes", (uint)num_bytes)); + mp_raise_msg_varg(&mp_type_MemoryError, + "memory allocation failed, allocating %u bytes", (uint)num_bytes); } NORETURN void mp_raise_msg(const mp_obj_type_t *exc_type, const char *msg) { @@ -1494,6 +1491,14 @@ NORETURN void mp_raise_msg(const mp_obj_type_t *exc_type, const char *msg) { } } +NORETURN void mp_raise_msg_varg(const mp_obj_type_t *exc_type, const char *fmt, ...) { + va_list args; + va_start(args, fmt); + mp_obj_t exc = mp_obj_new_exception_msg_varg2(exc_type, fmt, args); + va_end(args); + nlr_raise(exc); +} + NORETURN void mp_raise_ValueError(const char *msg) { mp_raise_msg(&mp_type_ValueError, msg); } diff --git a/py/runtime.h b/py/runtime.h index 7f7a89f3f..46e08872b 100644 --- a/py/runtime.h +++ b/py/runtime.h @@ -153,6 +153,7 @@ void mp_import_all(mp_obj_t module); #define mp_raise_type(exc_type) mp_raise_msg(exc_type, NULL) NORETURN void mp_raise_msg(const mp_obj_type_t *exc_type, const char *msg); +NORETURN void mp_raise_msg_varg(const mp_obj_type_t *exc_type, const char *fmt, ...); NORETURN void mp_raise_ValueError(const char *msg); NORETURN void mp_raise_TypeError(const char *msg); NORETURN void mp_raise_NotImplementedError(const char *msg); |