aboutsummaryrefslogtreecommitdiff
path: root/py/objtype.c
diff options
context:
space:
mode:
authorJeff Epler <jepler@unpythonic.net>2018-03-25 16:05:32 -0500
committerDamien George <damien.p.george@gmail.com>2018-05-30 11:11:24 +1000
commit05b13fd292b42f20affc7cae218d92447efbf6d6 (patch)
tree2b1f043c3000288fc01eb045eed7b0942e39f6b7 /py/objtype.c
parenta1acbad27a1e996c8f95b3d1c801aa2e31df9c99 (diff)
py/objtype: Fix assertion failures in mp_obj_new_type by checking types.
Fixes assertion failures when the arguments to type() were not of valid types, e.g., when making calls like: type("", (), 3) type("", 3, {})
Diffstat (limited to 'py/objtype.c')
-rw-r--r--py/objtype.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/py/objtype.c b/py/objtype.c
index 2ec27c762..9b57a5051 100644
--- a/py/objtype.c
+++ b/py/objtype.c
@@ -1005,8 +1005,13 @@ const mp_obj_type_t mp_type_type = {
};
mp_obj_t mp_obj_new_type(qstr name, mp_obj_t bases_tuple, mp_obj_t locals_dict) {
- assert(MP_OBJ_IS_TYPE(bases_tuple, &mp_type_tuple)); // MicroPython restriction, for now
- assert(MP_OBJ_IS_TYPE(locals_dict, &mp_type_dict)); // MicroPython restriction, for now
+ // Verify input objects have expected type
+ if (!MP_OBJ_IS_TYPE(bases_tuple, &mp_type_tuple)) {
+ mp_raise_TypeError(NULL);
+ }
+ if (!MP_OBJ_IS_TYPE(locals_dict, &mp_type_dict)) {
+ mp_raise_TypeError(NULL);
+ }
// TODO might need to make a copy of locals_dict; at least that's how CPython does it
@@ -1015,7 +1020,9 @@ mp_obj_t mp_obj_new_type(qstr name, mp_obj_t bases_tuple, mp_obj_t locals_dict)
mp_obj_t *bases_items;
mp_obj_tuple_get(bases_tuple, &bases_len, &bases_items);
for (size_t i = 0; i < bases_len; i++) {
- assert(MP_OBJ_IS_TYPE(bases_items[i], &mp_type_type));
+ if (!MP_OBJ_IS_TYPE(bases_items[i], &mp_type_type)) {
+ mp_raise_TypeError(NULL);
+ }
mp_obj_type_t *t = MP_OBJ_TO_PTR(bases_items[i]);
// TODO: Verify with CPy, tested on function type
if (t->make_new == NULL) {