mirror of
https://github.com/micropython/micropython.git
synced 2026-01-04 11:10:14 +01:00
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
This commit is contained in:
71
py/runtime.c
71
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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user