Skip to content

Commit fa20860

Browse files
committed
traceback: share more code between format & print exception
1 parent 00c9004 commit fa20860

File tree

1 file changed

+38
-38
lines changed

1 file changed

+38
-38
lines changed

shared-bindings/traceback/__init__.c

Lines changed: 38 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,42 @@
3838
//| """
3939
//| ...
4040

41-
STATIC void traceback_exception_common(mp_print_t *print, mp_obj_t value, mp_obj_t tb_obj, mp_obj_t limit_obj) {
41+
STATIC void traceback_exception_common(bool is_print_exception, mp_print_t *print, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
42+
enum { ARG_etype, ARG_value, ARG_tb, ARG_limit, ARG_file, ARG_chain };
43+
static const mp_arg_t allowed_args[] = {
44+
{ MP_QSTR_etype, MP_ARG_OBJ | MP_ARG_REQUIRED, {.u_obj = MP_OBJ_NULL} },
45+
{ MP_QSTR_value, MP_ARG_OBJ | MP_ARG_REQUIRED, {.u_obj = MP_OBJ_NULL} },
46+
{ MP_QSTR_tb, MP_ARG_OBJ | MP_ARG_REQUIRED, {.u_obj = MP_OBJ_NULL} },
47+
{ MP_QSTR_limit, MP_ARG_OBJ, {.u_obj = mp_const_none} },
48+
{ MP_QSTR_file, MP_ARG_OBJ, {.u_obj = mp_const_none} },
49+
{ MP_QSTR_chain, MP_ARG_BOOL, {.u_bool = true} },
50+
};
51+
52+
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
53+
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
54+
55+
mp_obj_t value = args[ARG_value].u_obj;
56+
mp_obj_t tb_obj = args[ARG_tb].u_obj;
57+
mp_obj_t limit_obj = args[ARG_limit].u_obj;
58+
59+
if (args[ARG_file].u_obj != mp_const_none) {
60+
if (!is_print_exception) {
61+
#if MICROPY_ERROR_REPORTING <= MICROPY_ERROR_REPORTING_TERSE
62+
mp_arg_error_terse_mismatch();
63+
#else
64+
mp_raise_msg_varg(&mp_type_TypeError, MP_ERROR_TEXT("unexpected keyword argument '%q'"), MP_QSTR_file);
65+
#endif
66+
67+
}
68+
#if MICROPY_PY_IO && MICROPY_PY_SYS_STDFILES
69+
mp_get_stream_raise(args[ARG_file].u_obj, MP_STREAM_OP_WRITE);
70+
print->data = MP_OBJ_TO_PTR(args[ARG_file].u_obj);
71+
print->print_strn = mp_stream_write_adaptor;
72+
#else
73+
mp_raise_NotImplementedError(translate("file write is not available"));
74+
#endif
75+
}
76+
4277
if (!mp_obj_is_exception_instance(value)) {
4378
mp_raise_TypeError(translate("invalid exception"));
4479
}
@@ -91,22 +126,10 @@ STATIC void traceback_exception_common(mp_print_t *print, mp_obj_t value, mp_obj
91126
//| ...
92127
//|
93128
STATIC mp_obj_t traceback_format_exception(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
94-
enum { ARG_etype, ARG_value, ARG_tb, ARG_limit, ARG_chain };
95-
static const mp_arg_t allowed_args[] = {
96-
{ MP_QSTR_etype, MP_ARG_OBJ | MP_ARG_REQUIRED, {.u_obj = MP_OBJ_NULL} },
97-
{ MP_QSTR_value, MP_ARG_OBJ | MP_ARG_REQUIRED, {.u_obj = MP_OBJ_NULL} },
98-
{ MP_QSTR_tb, MP_ARG_OBJ | MP_ARG_REQUIRED, {.u_obj = MP_OBJ_NULL} },
99-
{ MP_QSTR_limit, MP_ARG_OBJ, {.u_obj = mp_const_none} },
100-
{ MP_QSTR_chain, MP_ARG_BOOL, {.u_bool = true} },
101-
};
102-
103-
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
104-
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
105-
106129
mp_print_t print;
107130
vstr_t vstr;
108131
vstr_init_print(&vstr, 0, &print);
109-
traceback_exception_common(&print, args[ARG_value].u_obj, args[ARG_tb].u_obj, args[ARG_limit].u_obj);
132+
traceback_exception_common(false, &print, n_args, pos_args, kw_args);
110133
return mp_obj_new_str_from_vstr(&mp_type_str, &vstr);
111134
}
112135

@@ -139,31 +162,8 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_KW(traceback_format_exception_obj, 0, traceback_f
139162
//|
140163

141164
STATIC mp_obj_t traceback_print_exception(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
142-
enum { ARG_etype, ARG_value, ARG_tb, ARG_limit, ARG_file, ARG_chain };
143-
static const mp_arg_t allowed_args[] = {
144-
{ MP_QSTR_etype, MP_ARG_OBJ | MP_ARG_REQUIRED, {.u_obj = MP_OBJ_NULL} },
145-
{ MP_QSTR_value, MP_ARG_OBJ | MP_ARG_REQUIRED, {.u_obj = MP_OBJ_NULL} },
146-
{ MP_QSTR_tb, MP_ARG_OBJ | MP_ARG_REQUIRED, {.u_obj = MP_OBJ_NULL} },
147-
{ MP_QSTR_limit, MP_ARG_OBJ, {.u_obj = mp_const_none} },
148-
{ MP_QSTR_file, MP_ARG_OBJ, {.u_obj = mp_const_none} },
149-
{ MP_QSTR_chain, MP_ARG_BOOL, {.u_bool = true} },
150-
};
151-
152-
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
153-
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
154-
155165
mp_print_t print = mp_plat_print;
156-
if (args[ARG_file].u_obj != mp_const_none) {
157-
#if MICROPY_PY_IO && MICROPY_PY_SYS_STDFILES
158-
mp_get_stream_raise(args[ARG_file].u_obj, MP_STREAM_OP_WRITE);
159-
print.data = MP_OBJ_TO_PTR(args[ARG_file].u_obj);
160-
print.print_strn = mp_stream_write_adaptor;
161-
#else
162-
mp_raise_NotImplementedError(translate("file write is not available"));
163-
#endif
164-
}
165-
166-
traceback_exception_common(&print, args[ARG_value].u_obj, args[ARG_tb].u_obj, args[ARG_limit].u_obj);
166+
traceback_exception_common(true, &print, n_args, pos_args, kw_args);
167167
return mp_const_none;
168168
}
169169
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(traceback_print_exception_obj, 0, traceback_print_exception);

0 commit comments

Comments
 (0)