|
38 | 38 | //| """
|
39 | 39 | //| ...
|
40 | 40 |
|
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 | + |
42 | 77 | if (!mp_obj_is_exception_instance(value)) {
|
43 | 78 | mp_raise_TypeError(translate("invalid exception"));
|
44 | 79 | }
|
@@ -91,22 +126,10 @@ STATIC void traceback_exception_common(mp_print_t *print, mp_obj_t value, mp_obj
|
91 | 126 | //| ...
|
92 | 127 | //|
|
93 | 128 | 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 |
| - |
106 | 129 | mp_print_t print;
|
107 | 130 | vstr_t vstr;
|
108 | 131 | 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); |
110 | 133 | return mp_obj_new_str_from_vstr(&mp_type_str, &vstr);
|
111 | 134 | }
|
112 | 135 |
|
@@ -139,31 +162,8 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_KW(traceback_format_exception_obj, 0, traceback_f
|
139 | 162 | //|
|
140 | 163 |
|
141 | 164 | 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 |
| - |
155 | 165 | 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); |
167 | 167 | return mp_const_none;
|
168 | 168 | }
|
169 | 169 | STATIC MP_DEFINE_CONST_FUN_OBJ_KW(traceback_print_exception_obj, 0, traceback_print_exception);
|
|
0 commit comments