summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--py/objtype.c12
-rw-r--r--tests/basics/del_attr.py7
-rw-r--r--tests/basics/setattr1.py7
3 files changed, 20 insertions, 6 deletions
diff --git a/py/objtype.c b/py/objtype.c
index 33757287ac..7df349ce9b 100644
--- a/py/objtype.c
+++ b/py/objtype.c
@@ -975,21 +975,21 @@ STATIC void type_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) {
if (self->locals_dict != NULL) {
assert(self->locals_dict->base.type == &mp_type_dict); // MicroPython restriction, for now
mp_map_t *locals_map = &self->locals_dict->map;
+ if (locals_map->is_fixed) {
+ // can't apply delete/store to a fixed map
+ return;
+ }
if (dest[1] == MP_OBJ_NULL) {
// delete attribute
mp_map_elem_t *elem = mp_map_lookup(locals_map, MP_OBJ_NEW_QSTR(attr), MP_MAP_LOOKUP_REMOVE_IF_FOUND);
- // note that locals_map may be in ROM, so remove will fail in that case
if (elem != NULL) {
dest[0] = MP_OBJ_NULL; // indicate success
}
} else {
// store attribute
mp_map_elem_t *elem = mp_map_lookup(locals_map, MP_OBJ_NEW_QSTR(attr), MP_MAP_LOOKUP_ADD_IF_NOT_FOUND);
- // note that locals_map may be in ROM, so add will fail in that case
- if (elem != NULL) {
- elem->value = dest[1];
- dest[0] = MP_OBJ_NULL; // indicate success
- }
+ elem->value = dest[1];
+ dest[0] = MP_OBJ_NULL; // indicate success
}
}
}
diff --git a/tests/basics/del_attr.py b/tests/basics/del_attr.py
index bec7afb848..8487b97e31 100644
--- a/tests/basics/del_attr.py
+++ b/tests/basics/del_attr.py
@@ -30,3 +30,10 @@ try:
del c.x
except AttributeError:
print("AttributeError")
+
+# try to del an attribute of a built-in class
+try:
+ del int.to_bytes
+except (AttributeError, TypeError):
+ # uPy raises AttributeError, CPython raises TypeError
+ print('AttributeError/TypeError')
diff --git a/tests/basics/setattr1.py b/tests/basics/setattr1.py
index 9693aca819..e4acb14cac 100644
--- a/tests/basics/setattr1.py
+++ b/tests/basics/setattr1.py
@@ -16,3 +16,10 @@ try:
setattr(a, b'var3', 1)
except TypeError:
print('TypeError')
+
+# try setattr on a built-in function
+try:
+ setattr(int, 'to_bytes', 1)
+except (AttributeError, TypeError):
+ # uPy raises AttributeError, CPython raises TypeError
+ print('AttributeError/TypeError')