Skip to content

Commit 9113e17

Browse files
committed
Throw TypeError when json-serializing invalid types
This behavior is in line with standard Python Closes: #9768
1 parent 24a8927 commit 9113e17

File tree

12 files changed

+32
-16
lines changed

12 files changed

+32
-16
lines changed

py/obj.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,13 @@ void mp_obj_print_helper(const mp_print_t *print, mp_obj_t o_in, mp_print_kind_t
144144
}
145145
#endif
146146
const mp_obj_type_t *type = mp_obj_get_type(o_in);
147+
// CIRCUITPY-CHANGE: Diagnose json.dump on invalid types
148+
#if MICROPY_PY_JSON
149+
if (kind == PRINT_JSON && !(type->flags & MP_TYPE_FLAG_PRINT_JSON)) {
150+
mp_raise_msg_varg(&mp_type_TypeError,
151+
MP_ERROR_TEXT("can't convert %q to %q"), type->name, MP_QSTR_json);
152+
}
153+
#endif
147154
if (MP_OBJ_TYPE_HAS_SLOT(type, print)) {
148155
MP_OBJ_TYPE_GET_SLOT(type, print)((mp_print_t *)print, o_in, kind);
149156
} else {

py/obj.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -581,6 +581,8 @@ typedef mp_obj_t (*mp_fun_kw_t)(size_t n, const mp_obj_t *, mp_map_t *);
581581
#define MP_TYPE_FLAG_ITER_IS_CUSTOM (0x0100)
582582
#define MP_TYPE_FLAG_ITER_IS_STREAM (MP_TYPE_FLAG_ITER_IS_ITERNEXT | MP_TYPE_FLAG_ITER_IS_CUSTOM)
583583
#define MP_TYPE_FLAG_INSTANCE_TYPE (0x0200)
584+
// CIRCUITPY-CHANGE: check for valid types in json dumps
585+
#define MP_TYPE_FLAG_PRINT_JSON (0x0400)
584586

585587
typedef enum {
586588
PRINT_STR = 0,

py/objbool.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,12 @@ static mp_obj_t bool_binary_op(mp_binary_op_t op, mp_obj_t lhs_in, mp_obj_t rhs_
8484
return mp_binary_op(op, MP_OBJ_NEW_SMALL_INT(value), rhs_in);
8585
}
8686

87+
// CIRCUITPY-CHANGE: Diagnose json.dump on invalid types
8788
MP_DEFINE_CONST_OBJ_TYPE(
8889
// can match all numeric types
8990
mp_type_bool,
9091
MP_QSTR_bool,
91-
MP_TYPE_FLAG_EQ_CHECKS_OTHER_TYPE,
92+
MP_TYPE_FLAG_EQ_CHECKS_OTHER_TYPE | MP_TYPE_FLAG_PRINT_JSON,
9293
make_new, bool_make_new,
9394
print, bool_print,
9495
unary_op, bool_unary_op,

py/objdict.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -710,10 +710,11 @@ static const mp_rom_map_elem_t dict_locals_dict_table[] = {
710710

711711
static MP_DEFINE_CONST_DICT(dict_locals_dict, dict_locals_dict_table);
712712

713+
// CIRCUITPY-CHANGE: Diagnose json.dump on invalid types
713714
MP_DEFINE_CONST_OBJ_TYPE(
714715
mp_type_dict,
715716
MP_QSTR_dict,
716-
MP_TYPE_FLAG_ITER_IS_GETITER,
717+
MP_TYPE_FLAG_ITER_IS_GETITER | MP_TYPE_FLAG_PRINT_JSON,
717718
make_new, mp_obj_dict_make_new,
718719
print, dict_print,
719720
unary_op, dict_unary_op,
@@ -724,10 +725,11 @@ MP_DEFINE_CONST_OBJ_TYPE(
724725
);
725726

726727
#if MICROPY_PY_COLLECTIONS_ORDEREDDICT
728+
// CIRCUITPY-CHANGE: Diagnose json.dump on invalid types
727729
MP_DEFINE_CONST_OBJ_TYPE(
728730
mp_type_ordereddict,
729731
MP_QSTR_OrderedDict,
730-
MP_TYPE_FLAG_ITER_IS_GETITER,
732+
MP_TYPE_FLAG_ITER_IS_GETITER | MP_TYPE_FLAG_PRINT_JSON,
731733
make_new, mp_obj_dict_make_new,
732734
print, dict_print,
733735
unary_op, dict_unary_op,

py/objfloat.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,8 +186,9 @@ static mp_obj_t float_binary_op(mp_binary_op_t op, mp_obj_t lhs_in, mp_obj_t rhs
186186
return mp_obj_float_binary_op(op, lhs_val, rhs_in);
187187
}
188188

189+
// CIRCUITPY-CHANGE: Diagnose json.dump on invalid types
189190
MP_DEFINE_CONST_OBJ_TYPE(
190-
mp_type_float, MP_QSTR_float, MP_TYPE_FLAG_EQ_NOT_REFLEXIVE | MP_TYPE_FLAG_EQ_CHECKS_OTHER_TYPE,
191+
mp_type_float, MP_QSTR_float, MP_TYPE_FLAG_EQ_NOT_REFLEXIVE | MP_TYPE_FLAG_EQ_CHECKS_OTHER_TYPE | MP_TYPE_FLAG_PRINT_JSON,
191192
make_new, float_make_new,
192193
print, float_print,
193194
unary_op, float_unary_op,

py/objint.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -588,10 +588,11 @@ static const mp_rom_map_elem_t int_locals_dict_table[] = {
588588

589589
static MP_DEFINE_CONST_DICT(int_locals_dict, int_locals_dict_table);
590590

591+
// CIRCUITPY-CHANGE: Diagnose json.dump on invalid types
591592
MP_DEFINE_CONST_OBJ_TYPE(
592593
mp_type_int,
593594
MP_QSTR_int,
594-
MP_TYPE_FLAG_NONE,
595+
MP_TYPE_FLAG_PRINT_JSON,
595596
make_new, mp_obj_int_make_new,
596597
print, mp_obj_int_print,
597598
unary_op, mp_obj_int_unary_op,

py/objlist.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -485,10 +485,11 @@ static const mp_rom_map_elem_t list_locals_dict_table[] = {
485485

486486
static MP_DEFINE_CONST_DICT(list_locals_dict, list_locals_dict_table);
487487

488+
// CIRCUITPY-CHANGE: Diagnose json.dump on invalid types
488489
MP_DEFINE_CONST_OBJ_TYPE(
489490
mp_type_list,
490491
MP_QSTR_list,
491-
MP_TYPE_FLAG_ITER_IS_GETITER,
492+
MP_TYPE_FLAG_ITER_IS_GETITER | MP_TYPE_FLAG_PRINT_JSON,
492493
make_new, mp_obj_list_make_new,
493494
print, list_print,
494495
unary_op, list_unary_op,

py/objnone.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,11 @@ static void none_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_
4343
}
4444
}
4545

46+
// CIRCUITPY-CHANGE: Diagnose json.dump on invalid types
4647
MP_DEFINE_CONST_OBJ_TYPE(
4748
mp_type_NoneType,
4849
MP_QSTR_NoneType,
49-
MP_TYPE_FLAG_NONE,
50+
MP_TYPE_FLAG_PRINT_JSON,
5051
print, none_print
5152
);
5253

py/objstr.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2203,10 +2203,11 @@ MP_DEFINE_CONST_DICT_WITH_SIZE(mp_obj_memoryview_locals_dict,
22032203
#if !MICROPY_PY_BUILTINS_STR_UNICODE
22042204
static mp_obj_t mp_obj_new_str_iterator(mp_obj_t str, mp_obj_iter_buf_t *iter_buf);
22052205

2206+
// CIRCUITPY-CHANGE: Diagnose json.dump on invalid types
22062207
MP_DEFINE_CONST_OBJ_TYPE(
22072208
mp_type_str,
22082209
MP_QSTR_str,
2209-
MP_TYPE_FLAG_NONE,
2210+
MP_TYPE_FLAG_PRINT_JSON,
22102211
make_new, mp_obj_str_make_new,
22112212
print, str_print,
22122213
binary_op, mp_obj_str_binary_op,

py/objstrunicode.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,10 +236,11 @@ static mp_obj_t str_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
236236
}
237237
}
238238

239+
// CIRCUITPY-CHANGE: Diagnose json.dump on invalid types
239240
MP_DEFINE_CONST_OBJ_TYPE(
240241
mp_type_str,
241242
MP_QSTR_str,
242-
MP_TYPE_FLAG_ITER_IS_GETITER,
243+
MP_TYPE_FLAG_ITER_IS_GETITER | MP_TYPE_FLAG_PRINT_JSON,
243244
make_new, mp_obj_str_make_new,
244245
print, uni_print,
245246
unary_op, uni_unary_op,

0 commit comments

Comments
 (0)