summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Epler <jepler@unpythonic.net>2018-03-25 16:05:32 -0500
committerJeff Epler <jepler@gmail.com>2018-03-29 06:42:10 -0500
commit6da8d7c46583387aa32d5c153b3c5b7d9e1afccd (patch)
treed8ea634d36998cd68050ffd159a6e0093a9ca6f1
parenta55988a547011c04978a1661325062397ef74110 (diff)
Fix assertion failures in mp_obj_new_type
Fixes the following assertion failures when the arguments to type() were not of valid types: micropython: ../../py/objtype.c:984: mp_obj_new_type: Assertion `MP_OBJ_IS_TYPE(bases_tuple, &mp_type_tuple)' failed. micropython: ../../py/objtype.c:994: mp_obj_new_type: Assertion `MP_OBJ_IS_TYPE(items[i], &mp_type_type)' failed. e.g., when making calls like type("", (), 3) type("", 3, {})
-rw-r--r--py/objtype.c14
-rw-r--r--tests/basics/types3.py20
2 files changed, 31 insertions, 3 deletions
diff --git a/py/objtype.c b/py/objtype.c
index 7262892bd..3fa25eb77 100644
--- a/py/objtype.c
+++ b/py/objtype.c
@@ -981,8 +981,14 @@ 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
+ if(!MP_OBJ_IS_TYPE(bases_tuple, &mp_type_tuple)) {
+ // MicroPython restriction, for now
+ mp_raise_TypeError("type() argument 2 must be tuple");
+ }
+ if(!MP_OBJ_IS_TYPE(locals_dict, &mp_type_dict)) {
+ // MicroPython restriction, for now
+ mp_raise_TypeError("type() argument 3 must be dict");
+ }
// TODO might need to make a copy of locals_dict; at least that's how CPython does it
@@ -991,7 +997,9 @@ mp_obj_t mp_obj_new_type(qstr name, mp_obj_t bases_tuple, mp_obj_t locals_dict)
mp_obj_t *items;
mp_obj_tuple_get(bases_tuple, &len, &items);
for (size_t i = 0; i < len; i++) {
- assert(MP_OBJ_IS_TYPE(items[i], &mp_type_type));
+ if(!MP_OBJ_IS_TYPE(items[i], &mp_type_type)) {
+ mp_raise_TypeError("type is not an acceptable base type");
+ }
mp_obj_type_t *t = MP_OBJ_TO_PTR(items[i]);
// TODO: Verify with CPy, tested on function type
if (t->make_new == NULL) {
diff --git a/tests/basics/types3.py b/tests/basics/types3.py
new file mode 100644
index 000000000..71f790692
--- /dev/null
+++ b/tests/basics/types3.py
@@ -0,0 +1,20 @@
+try:
+ type('abc', None, None)
+except TypeError:
+ print(True)
+else:
+ print(False)
+
+try:
+ type('abc', (), None)
+except TypeError:
+ print(True)
+else:
+ print(False)
+
+try:
+ type('abc', (1,), {})
+except TypeError:
+ print(True)
+else:
+ print(False)