Skip to content

Commit ea13f40

Browse files
committed
py: Change nlr_jump to nlr_raise, to aid in debugging.
This does not affect code size or performance when debugging turned off. To address issue adafruit#420.
1 parent 2a03740 commit ea13f40

52 files changed

Lines changed: 235 additions & 222 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

py/builtin.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ STATIC mp_obj_t mp_builtin_chr(mp_obj_t o_in) {
141141
byte str[1] = {ord};
142142
return mp_obj_new_str(str, 1, true);
143143
} else {
144-
nlr_jump(mp_obj_new_exception_msg(&mp_type_ValueError, "chr() arg not in range(0x110000)"));
144+
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "chr() arg not in range(0x110000)"));
145145
}
146146
}
147147

@@ -194,7 +194,7 @@ STATIC mp_obj_t mp_builtin_divmod(mp_obj_t o1_in, mp_obj_t o2_in) {
194194
args[1] = MP_OBJ_NEW_SMALL_INT(i1 % i2);
195195
return mp_obj_new_tuple(2, args);
196196
} else {
197-
nlr_jump(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "unsupported operand type(s) for divmod(): '%s' and '%s'", mp_obj_get_type_str(o1_in), mp_obj_get_type_str(o2_in)));
197+
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "unsupported operand type(s) for divmod(): '%s' and '%s'", mp_obj_get_type_str(o1_in), mp_obj_get_type_str(o2_in)));
198198
}
199199
}
200200

@@ -216,7 +216,7 @@ MP_DEFINE_CONST_FUN_OBJ_1(mp_builtin_iter_obj, mp_builtin_iter);
216216
STATIC mp_obj_t mp_builtin_len(mp_obj_t o_in) {
217217
mp_obj_t len = mp_obj_len_maybe(o_in);
218218
if (len == NULL) {
219-
nlr_jump(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "object of type '%s' has no len()", mp_obj_get_type_str(o_in)));
219+
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)));
220220
} else {
221221
return len;
222222
}
@@ -236,7 +236,7 @@ STATIC mp_obj_t mp_builtin_max(uint n_args, const mp_obj_t *args) {
236236
}
237237
}
238238
if (max_obj == NULL) {
239-
nlr_jump(mp_obj_new_exception_msg(&mp_type_ValueError, "max() arg is an empty sequence"));
239+
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "max() arg is an empty sequence"));
240240
}
241241
return max_obj;
242242
} else {
@@ -265,7 +265,7 @@ STATIC mp_obj_t mp_builtin_min(uint n_args, const mp_obj_t *args) {
265265
}
266266
}
267267
if (min_obj == NULL) {
268-
nlr_jump(mp_obj_new_exception_msg(&mp_type_ValueError, "min() arg is an empty sequence"));
268+
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "min() arg is an empty sequence"));
269269
}
270270
return min_obj;
271271
} else {
@@ -285,7 +285,7 @@ MP_DEFINE_CONST_FUN_OBJ_VAR(mp_builtin_min_obj, 1, mp_builtin_min);
285285
STATIC mp_obj_t mp_builtin_next(mp_obj_t o) {
286286
mp_obj_t ret = mp_iternext_allow_raise(o);
287287
if (ret == MP_OBJ_NULL) {
288-
nlr_jump(mp_obj_new_exception(&mp_type_StopIteration));
288+
nlr_raise(mp_obj_new_exception(&mp_type_StopIteration));
289289
} else {
290290
return ret;
291291
}
@@ -301,7 +301,7 @@ STATIC mp_obj_t mp_builtin_ord(mp_obj_t o_in) {
301301
// TODO unicode
302302
return mp_obj_new_int(((const byte*)str)[0]);
303303
} else {
304-
nlr_jump(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "ord() expected a character, but string of length %d found", len));
304+
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "ord() expected a character, but string of length %d found", len));
305305
}
306306
}
307307

@@ -383,7 +383,7 @@ MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_builtin_sum_obj, 1, 2, mp_builtin_sum);
383383
STATIC mp_obj_t mp_builtin_sorted(uint n_args, const mp_obj_t *args, mp_map_t *kwargs) {
384384
assert(n_args >= 1);
385385
if (n_args > 1) {
386-
nlr_jump(mp_obj_new_exception_msg(&mp_type_TypeError,
386+
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError,
387387
"must use keyword argument for key function"));
388388
}
389389
mp_obj_t self = mp_type_list.make_new((mp_obj_t)&mp_type_list, 1, 0, args);

py/builtinevex.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ STATIC mp_obj_t parse_compile_execute(mp_obj_t o_in, mp_parse_input_kind_t parse
2929

3030
if (pn == MP_PARSE_NODE_NULL) {
3131
// parse error; raise exception
32-
nlr_jump(mp_parse_make_exception(parse_error_kind));
32+
nlr_raise(mp_parse_make_exception(parse_error_kind));
3333
}
3434

3535
// compile the string

py/builtinimport.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ void do_load(mp_obj_t module_obj, vstr_t *file) {
7777

7878
if (lex == NULL) {
7979
// we verified the file exists using stat, but lexer could still fail
80-
nlr_jump(mp_obj_new_exception_msg_varg(&mp_type_ImportError, "ImportError: No module named '%s'", vstr_str(file)));
80+
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ImportError, "ImportError: No module named '%s'", vstr_str(file)));
8181
}
8282

8383
qstr source_name = mp_lexer_source_name(lex);
@@ -99,7 +99,7 @@ void do_load(mp_obj_t module_obj, vstr_t *file) {
9999
// parse error; clean up and raise exception
100100
mp_locals_set(old_locals);
101101
mp_globals_set(old_globals);
102-
nlr_jump(mp_parse_make_exception(parse_error_kind));
102+
nlr_raise(mp_parse_make_exception(parse_error_kind));
103103
}
104104

105105
// compile the imported script
@@ -122,7 +122,7 @@ void do_load(mp_obj_t module_obj, vstr_t *file) {
122122
// exception; restore context and re-raise same exception
123123
mp_locals_set(old_locals);
124124
mp_globals_set(old_globals);
125-
nlr_jump(nlr.ret_val);
125+
nlr_raise(nlr.ret_val);
126126
}
127127
mp_locals_set(old_locals);
128128
mp_globals_set(old_globals);
@@ -148,7 +148,7 @@ mp_obj_t mp_builtin___import__(uint n_args, mp_obj_t *args) {
148148
}
149149

150150
if (level != 0) {
151-
nlr_jump(mp_obj_new_exception_msg(&mp_type_NotImplementedError,
151+
nlr_raise(mp_obj_new_exception_msg(&mp_type_NotImplementedError,
152152
"Relative import is not implemented"));
153153
}
154154

@@ -197,7 +197,7 @@ mp_obj_t mp_builtin___import__(uint n_args, mp_obj_t *args) {
197197

198198
// fail if we couldn't find the file
199199
if (stat == MP_IMPORT_STAT_NO_EXIST) {
200-
nlr_jump(mp_obj_new_exception_msg_varg(&mp_type_ImportError, "ImportError: No module named '%s'", qstr_str(mod_name)));
200+
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ImportError, "ImportError: No module named '%s'", qstr_str(mod_name)));
201201
}
202202

203203
module_obj = mp_module_get(mod_name);
@@ -211,7 +211,7 @@ mp_obj_t mp_builtin___import__(uint n_args, mp_obj_t *args) {
211211
vstr_add_str(&path, "__init__.py");
212212
if (mp_import_stat(vstr_str(&path)) != MP_IMPORT_STAT_FILE) {
213213
vstr_cut_tail_bytes(&path, sizeof("/__init__.py") - 1); // cut off /__init__.py
214-
nlr_jump(mp_obj_new_exception_msg_varg(&mp_type_ImportError,
214+
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ImportError,
215215
"Per PEP-420 a dir without __init__.py (%s) is a namespace package; "
216216
"namespace packages are not supported", vstr_str(&path)));
217217
}

py/nlr.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,16 @@ struct _nlr_buf_t {
2626
unsigned int nlr_push(nlr_buf_t *);
2727
void nlr_pop(void);
2828
void nlr_jump(void *val) __attribute__((noreturn));
29+
30+
// use nlr_raise instead of nlr_jump so that debugging is easier
31+
#ifndef DEBUG
32+
#define nlr_raise(val) nlr_jump(val)
33+
#else
34+
#define nlr_raise(val) \
35+
do { \
36+
void *_val = val; \
37+
assert(_val != NULL); \
38+
assert(mp_obj_is_exception_instance(_val)); \
39+
nlr_jump(_val); \
40+
} while (0)
41+
#endif

py/obj.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ machine_int_t mp_obj_hash(mp_obj_t o_in) {
125125
// TODO delegate to __hash__ method if it exists
126126

127127
} else {
128-
nlr_jump(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "unhashable type: '%s'", mp_obj_get_type_str(o_in)));
128+
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "unhashable type: '%s'", mp_obj_get_type_str(o_in)));
129129
}
130130
}
131131

@@ -174,7 +174,7 @@ bool mp_obj_equal(mp_obj_t o1, mp_obj_t o2) {
174174
}
175175
}
176176

177-
nlr_jump(mp_obj_new_exception_msg_varg(&mp_type_NotImplementedError,
177+
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_NotImplementedError,
178178
"Equality for '%s' and '%s' types not yet implemented", mp_obj_get_type_str(o1), mp_obj_get_type_str(o2)));
179179
return false;
180180
}
@@ -193,7 +193,7 @@ machine_int_t mp_obj_get_int(mp_obj_t arg) {
193193
} else if (MP_OBJ_IS_TYPE(arg, &mp_type_int)) {
194194
return mp_obj_int_get_checked(arg);
195195
} else {
196-
nlr_jump(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "can't convert %s to int", mp_obj_get_type_str(arg)));
196+
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "can't convert %s to int", mp_obj_get_type_str(arg)));
197197
}
198198
}
199199

@@ -228,7 +228,7 @@ mp_float_t mp_obj_get_float(mp_obj_t arg) {
228228
} else if (MP_OBJ_IS_TYPE(arg, &mp_type_float)) {
229229
return mp_obj_float_get(arg);
230230
} else {
231-
nlr_jump(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "can't convert %s to float", mp_obj_get_type_str(arg)));
231+
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "can't convert %s to float", mp_obj_get_type_str(arg)));
232232
}
233233
}
234234

@@ -251,7 +251,7 @@ void mp_obj_get_complex(mp_obj_t arg, mp_float_t *real, mp_float_t *imag) {
251251
} else if (MP_OBJ_IS_TYPE(arg, &mp_type_complex)) {
252252
mp_obj_complex_get(arg, real, imag);
253253
} else {
254-
nlr_jump(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "can't convert %s to complex", mp_obj_get_type_str(arg)));
254+
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "can't convert %s to complex", mp_obj_get_type_str(arg)));
255255
}
256256
}
257257
#endif
@@ -262,7 +262,7 @@ void mp_obj_get_array(mp_obj_t o, uint *len, mp_obj_t **items) {
262262
} else if (MP_OBJ_IS_TYPE(o, &mp_type_list)) {
263263
mp_obj_list_get(o, len, items);
264264
} else {
265-
nlr_jump(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "object '%s' is not a tuple or list", mp_obj_get_type_str(o)));
265+
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "object '%s' is not a tuple or list", mp_obj_get_type_str(o)));
266266
}
267267
}
268268

@@ -275,10 +275,10 @@ void mp_obj_get_array_fixed_n(mp_obj_t o, uint len, mp_obj_t **items) {
275275
mp_obj_list_get(o, &seq_len, items);
276276
}
277277
if (seq_len != len) {
278-
nlr_jump(mp_obj_new_exception_msg_varg(&mp_type_IndexError, "requested length %d but object has length %d", len, seq_len));
278+
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_IndexError, "requested length %d but object has length %d", len, seq_len));
279279
}
280280
} else {
281-
nlr_jump(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "object '%s' is not a tuple or list", mp_obj_get_type_str(o)));
281+
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "object '%s' is not a tuple or list", mp_obj_get_type_str(o)));
282282
}
283283
}
284284

@@ -290,7 +290,7 @@ uint mp_get_index(const mp_obj_type_t *type, machine_uint_t len, mp_obj_t index,
290290
} else if (MP_OBJ_IS_TYPE(index, &mp_type_bool)) {
291291
i = (index == mp_const_true ? 1 : 0);
292292
} else {
293-
nlr_jump(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "%s indices must be integers, not %s", qstr_str(type->name), mp_obj_get_type_str(index)));
293+
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "%s indices must be integers, not %s", qstr_str(type->name), mp_obj_get_type_str(index)));
294294
}
295295

296296
if (i < 0) {
@@ -304,7 +304,7 @@ uint mp_get_index(const mp_obj_type_t *type, machine_uint_t len, mp_obj_t index,
304304
}
305305
} else {
306306
if (i < 0 || i >= len) {
307-
nlr_jump(mp_obj_new_exception_msg_varg(&mp_type_IndexError, "%s index out of range", qstr_str(type->name)));
307+
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_IndexError, "%s index out of range", qstr_str(type->name)));
308308
}
309309
}
310310
return i;

py/objarray.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ STATIC mp_obj_t array_construct(char typecode, mp_obj_t initializer) {
7676

7777
STATIC mp_obj_t array_make_new(mp_obj_t type_in, uint n_args, uint n_kw, const mp_obj_t *args) {
7878
if (n_args < 1 || n_args > 2) {
79-
nlr_jump(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "unexpected # of arguments, %d given", n_args));
79+
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "unexpected # of arguments, %d given", n_args));
8080
}
8181
// TODO check args
8282
uint l;

py/objbool.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ STATIC mp_obj_t bool_make_new(mp_obj_t type_in, uint n_args, uint n_kw, const mp
2828
switch (n_args) {
2929
case 0: return mp_const_false;
3030
case 1: if (mp_obj_is_true(args[0])) { return mp_const_true; } else { return mp_const_false; }
31-
default: nlr_jump(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "bool takes at most 1 argument, %d given", n_args));
31+
default: nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "bool takes at most 1 argument, %d given", n_args));
3232
}
3333
}
3434

py/objcomplex.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ STATIC mp_obj_t complex_make_new(mp_obj_t type_in, uint n_args, uint n_kw, const
8686
}
8787

8888
default:
89-
nlr_jump(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "complex takes at most 2 arguments, %d given", n_args));
89+
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "complex takes at most 2 arguments, %d given", n_args));
9090
}
9191
}
9292

py/objdict.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ STATIC mp_obj_t dict_make_new(mp_obj_t type_in, uint n_args, uint n_kw, const mp
4343
assert(false);
4444

4545
default:
46-
nlr_jump(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "dict takes at most 1 argument"));
46+
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "dict takes at most 1 argument"));
4747
}
4848

4949
// add to the new dict any keyword args
@@ -71,7 +71,7 @@ STATIC mp_obj_t dict_binary_op(int op, mp_obj_t lhs_in, mp_obj_t rhs_in) {
7171
// dict load
7272
mp_map_elem_t *elem = mp_map_lookup(&o->map, rhs_in, MP_MAP_LOOKUP);
7373
if (elem == NULL) {
74-
nlr_jump(mp_obj_new_exception_msg(&mp_type_KeyError, "<value>"));
74+
nlr_raise(mp_obj_new_exception_msg(&mp_type_KeyError, "<value>"));
7575
} else {
7676
return elem->value;
7777
}
@@ -199,7 +199,7 @@ STATIC mp_obj_t dict_get_helper(mp_map_t *self, mp_obj_t key, mp_obj_t deflt, mp
199199
if (elem == NULL || elem->value == NULL) {
200200
if (deflt == NULL) {
201201
if (lookup_kind == MP_MAP_LOOKUP_REMOVE_IF_FOUND) {
202-
nlr_jump(mp_obj_new_exception_msg(&mp_type_KeyError, "<value>"));
202+
nlr_raise(mp_obj_new_exception_msg(&mp_type_KeyError, "<value>"));
203203
} else {
204204
value = mp_const_none;
205205
}
@@ -258,7 +258,7 @@ STATIC mp_obj_t dict_popitem(mp_obj_t self_in) {
258258
assert(MP_OBJ_IS_TYPE(self_in, &mp_type_dict));
259259
mp_obj_dict_t *self = self_in;
260260
if (self->map.used == 0) {
261-
nlr_jump(mp_obj_new_exception_msg(&mp_type_KeyError, "popitem(): dictionary is empty"));
261+
nlr_raise(mp_obj_new_exception_msg(&mp_type_KeyError, "popitem(): dictionary is empty"));
262262
}
263263
mp_obj_dict_it_t *iter = mp_obj_new_dict_iterator(self, 0);
264264

@@ -287,7 +287,7 @@ STATIC mp_obj_t dict_update(mp_obj_t self_in, mp_obj_t iterable) {
287287
if (key == MP_OBJ_NULL
288288
|| value == MP_OBJ_NULL
289289
|| stop != MP_OBJ_NULL) {
290-
nlr_jump(mp_obj_new_exception_msg(
290+
nlr_raise(mp_obj_new_exception_msg(
291291
&mp_type_ValueError,
292292
"dictionary update sequence has the wrong length"));
293293
} else {

py/objexcept.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ STATIC mp_obj_t mp_obj_exception_make_new(mp_obj_t type_in, uint n_args, uint n_
4848
mp_obj_type_t *type = type_in;
4949

5050
if (n_kw != 0) {
51-
nlr_jump(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "%s does not take keyword arguments", mp_obj_get_type_str(type_in)));
51+
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "%s does not take keyword arguments", mp_obj_get_type_str(type_in)));
5252
}
5353

5454
mp_obj_exception_t *o = m_new_obj_var(mp_obj_exception_t, mp_obj_t, n_args);

0 commit comments

Comments
 (0)